26.02.2014 Aufrufe

EasyLinux Programme und Skripte (Vorschau)

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Titel<br />

PureBasic<br />

die Sie brauchen, um eine kleine Shell<br />

(wie die Bash) zu entwickeln. Shells arbeiten<br />

im Wesentlichen wie folgt:<br />

l In einer Endlosschleife zeigen sie einen<br />

Shell-Prompt an, in der Bash sehen Sie<br />

z. B. immer Benutzer- <strong>und</strong> Rechnername,<br />

das aktuelle Verzeichnis <strong>und</strong> ein<br />

Dollar- ($) oder Raute-Zeichen (#).<br />

Dahinter geben Sie einen Befehl ein.<br />

l Die Shell muss dann einen neuen Prozess<br />

erzeugen, in dem das gewünschte<br />

Programm startet. Außerdem wartet sie,<br />

bis das neue Programm beendet wurde.<br />

l Danach springt die Shell an den Anfang<br />

der Endlosschleife zurück, <strong>und</strong> es<br />

erscheint wieder der Shell-Prompt.<br />

In PureBasic gibt es für Endlosschleifen<br />

die Befehle Repeat (wiederhole) <strong>und</strong> For-<br />

Ever („ewig“): Alles, was Sie zwischen<br />

diese beiden Befehle packen, wird dauerhaft<br />

wiederholt. Um aus einer solchen<br />

Schleife „ausbrechen“ zu können, steht<br />

der Befehl Break zur Verfügung. Die Mini-<br />

Shell soll sich bei Eingabe von exit beenden<br />

(wie es auch die Bash tut); dafür benötigen<br />

wir eine Fallunterscheidung.<br />

PureBasic unterstützt die klassische If-<br />

Then-Else-Konstruktion (siehe Artikel<br />

Print „Hallo Welt“ ab Seite 38) mit folgender<br />

Syntax:<br />

If Bedingung<br />

; Befehle<br />

Else<br />

; Befehle<br />

EndIf<br />

Den Else-Teil können Sie auch weglassen<br />

<strong>und</strong> hinter den Befehlen direkt EndIf<br />

schreiben. Das Semikolon ist in PureBasic<br />

das Zeichen, das Kommentare einleitet.<br />

Ein erster Ansatz für das Shell-Programm<br />

sieht damit wie folgt aus:<br />

Repeat<br />

Print ("EasyShell: ")<br />

eingabe$ = Input()<br />

If eingabe$ = "exit"<br />

Break ; Ende<br />

EndIf<br />

; Programm ausführen<br />

ForEver<br />

Abb. 4: Die Mini-Shell funktioniert: Mit wenigen Befehlen bilden Sie bereits die elementaren<br />

Funktionen einer echten Shell nach.<br />

Wenn Sie diesen Code eingeben <strong>und</strong> vor<br />

der ersten Zeile den für Terminalanwendungen<br />

zwingenden Befehl OpenConsole()<br />

ergänzen, können Sie das Programm bereits<br />

übersetzen <strong>und</strong> starten. Es liest so lange<br />

neue Befehle ein, bis Sie exit eingeben.<br />

Was noch fehlt, ist der Start der <strong>Programme</strong>.<br />

Dafür stellt PureBasic das Kommando<br />

RunProgram zur Verfügung. Sie<br />

könnten einfach den Befehl RunProgram<br />

(eingabe$) ergänzen; allerdings würde die<br />

Mini-Shell dann nicht auf das Ende der<br />

Programmausführung warten. RunProgram<br />

ist eine Funktion, die auch einen Rückgabewert<br />

hat: Den können Sie sich merken<br />

<strong>und</strong> in anderen PureBasic-Funktionen verwenden.<br />

Die korrekte Lösung für den Programmstart<br />

sieht folgendermaßen aus:<br />

p = RunProgram (eingabe$, "", "", #PB_ProgU<br />

ram_Open)<br />

WaitProgram (p)<br />

CloseProgram (p)<br />

Der Aufruf von RunProgram ist hier etwas<br />

komplexer. Wenn Sie in der PureBasic-<br />

Dokumentation nachschlagen, finden Sie<br />

heraus, dass Sie beim Programmstart die<br />

Option #PB_Program_Open verwenden<br />

müssen: Die sorgt dafür, dass die Mini-<br />

Shell das gestartete Programm beobachten<br />

kann. Um auf das Ende des Programms<br />

zu warten, benutzen Sie dann<br />

den Befehl WaitProgram(p).<br />

Er braucht p als Argument,<br />

denn Sie können mit RunProgram<br />

beliebig viele <strong>Programme</strong><br />

starten <strong>und</strong> müssen<br />

WaitProgram mitteilen, auf<br />

welches davon Sie warten<br />

möchten. Schließlich müssen<br />

Sie noch CloseProgram(p)<br />

aufrufen, um der Shell zu sagen,<br />

dass Sie das beendete<br />

Programm nicht weiter beobachten<br />

wollen.<br />

Bauen Sie diese drei Befehle<br />

anstelle des Kommentars einen aus.<br />

Abb. 5: Wenn der<br />

Editor Befehle vorschlägt,<br />

wählen Sie<br />

(; Programm ausführen) in das Programm<br />

ein, dann funktioniert es schon: Sie können<br />

die Mini-Shell mit [F5] kompilieren<br />

<strong>und</strong> starten <strong>und</strong> dann in Ihrem Shell-Programm<br />

z. B. ls oder ps eingeben. Ein Problem<br />

entsteht, wenn Sie ein falsches Kommando<br />

eingeben: Dann ist der Aufruf<br />

RunProgram (eingabe$, ...) nicht erfolgreich,<br />

<strong>und</strong> WaitProgram(p) führt zu einer<br />

Fehlermeldung, weil p nicht für ein gestartetes<br />

Programm steht (sondern den<br />

Fehlercode 0 enthält). Das Problem können<br />

Sie vermeiden, indem Sie mit<br />

IsProgram(p) testen, ob der Aufruf von<br />

RunProgram erfolgreich war:<br />

If IsProgram (p)<br />

WaitProgram (p)<br />

CloseProgram (p)<br />

EndIf<br />

Eine weitere Fehlfunktion Ihrer Mini-Shell<br />

entdecken Sie, wenn Sie in der Shell gar<br />

nichts eingeben <strong>und</strong> nur [Eingabe] drücken<br />

– dann schlägt schon der Aufruf von<br />

RunProgram fehl <strong>und</strong> verursacht<br />

einen Abbruch. Also<br />

müssen Sie noch den Fall einer<br />

leeren Eingabe abfangen.<br />

Dazu können Sie den Pure-<br />

Basic-Befehl Continue verwenden:<br />

Der führt in allen<br />

Schleifen dazu, dass die restlichen<br />

Befehle innerhalb der<br />

Schleife übersprungen werden<br />

<strong>und</strong> es direkt mit dem<br />

nächsten Schleifendurchlauf<br />

weitergeht. Wie das funktioniert,<br />

sehen Sie am leichtesten<br />

am folgenden Beispiel,<br />

56 www.easylinux.de<br />

<strong>EasyLinux</strong> 03/2013

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!