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