In den folgenden Abschnitten werden die Syntax für die beiden Instruktionen SHELL und EXEC vorgestellt und erläutert sowie vergleichende Betrachtungen zu diesen Instruktionen angestellt.
Es gibt zwei Varianten für die SHELL-Instruktion – eine Version mit vielen unterschiedlichen Optionen und eine einfache Variante, um einen Prozess zu starten:
[ ProzessVariable = ] SHELL Command [WAIT] [FOR {{READ|INPUT}|{WRITE|OUTPUT}}] [AS PEventName]
Hinweise:
Folgende Aufrufe sind korrekt:
SHELL "firefox www.gambas-buch.de" SHELL "dmesg | grep ttyS | grep 00: > /tmp/schnittstellenliste.liste" WAIT SHELL "dmesg | grep ttyUSB >> /tmp/schnittstellenliste.liste" WAIT Private $hProcess As Process aCommand = ["ping", "www.fewo-kellermann.de", "-c", "4"] $hProcess = EXEC aCommand For Read As "myPingProcess" aCommand = ["wget", "www.gambas-buch.de", "-O-", "--directory-prefix=" & User.Home] $hProcess = EXEC aCommand For Read As "myProcess" sCommand = "mysql -f -n -vvv -u root -pYourMySQLPassword4MySQLRoot" $hProcess = SHELL sCommand For Input Output As "myProcess"
Die 2. Syntax (Quick-Syntax) ist einfach:
SHELL sCommand TO String-Variable # sCommand ist ein String
Die Ausgaben des im Hintergrund gestarteten Prozesses werden in der (String-)Variable gespeichert.
Achtung: Sie haben keine Kontrolle über den blockierend ausgeführten Prozess! Wenn der Prozess nicht gestartet werden konnte, dann können Sie diesen Fehler abfangen.
Es gibt auch zwei Varianten für die EXEC-Instruktion, um einen Prozess zu starten:
[ ProzessVariable = ] EXEC Command [WAIT] [FOR {{READ|INPUT}|{WRITE|OUTPUT}}] [AS PEventName]
Folgende Aufrufe sind korrekt:
Private $hCommand As Process $hCommand = Exec [...] For Read Write As "MyCommand"
Zweite Variante der EXEC-Instruktion:
EXEC aCommand TO String-Variable # aCommand ist ein String-Array
Wenn Sie die zweite Syntax verwenden, wird der angegebene Exec-Befehl ausgeführt und der Interpreter wartet auf dessen Ende. Danach wird die komplette Ausgabe des im Hintergrund gestarteten Prozesses in die angegebene String-Variable geschrieben. Auch in diesem Fall gilt mit allen Konsequenzen: Sie haben keine Kontrolle über den ausgeführten Prozess!
Sie können für den zu startenden Prozess ausgewählte Umgebungsvariablen auf neue Werte setzen, indem Sie nach dem Shell- oder Exec-Befehl Cmd das Schlüsselwort WITH angeben, dem mit Environment ein Array aus Umgebungsvariablen-Werte-Paaren folgt:
[Process=] EXEC Cmd WITH Environment … [Process=] EXEC Cmd WITH Env_Array [WAIT] [FOR {{READ|INPUT}|{WRITE|OUTPUT}}] [AS PEventName]
[Process=] SHELL Cmd WITH Environment … [Process=] SHELL Cmd WITH Env_Array [WAIT] [FOR {{READ|INPUT}|{WRITE|OUTPUT}}] [AS PEventName]
Diesen Aufruf in einer Konsole :
hans@linux:~$ LC_ALL=en_GB.utf8 gambas3
können Sie in einem Gambas-Programm nachbilden, um mit der SHELL-Instruktion oder der EXEC-Instruktion zum Beispiel Gambas 3 temporär in der englischen Version zu starten:
Public Sub btnStartGambas3EN_Click() SHELL "gambas3" With ["LC_ALL=en_GB.utf8"] Wait EXEC ["gambas3"] With ["LC_ALL=de_DE.utf8"] Wait ' Alternative: EXEC-Instruktion End
Ob Sie die SHELL-Instruktion oder die EXEC-Instruktion verwenden, wird vor allem durch die zu bearbeitende Aufgabe bestimmt. Zuerst werden Unterschiede zwischen den Instruktionen SHELL und EXEC beschrieben und dann Gemeinsamkeiten herausgestellt. Damit können Sie sicherer entscheiden, ob Sie die SHELL-Instruktion oder die EXEC-Instruktion einsetzen, um erfolgreich zu arbeiten.
Es besteht ein wesentlicher Unterschied in der Art und Weise wie der übergebene Befehl (Command) ausgeführt wird und im Typ des Befehls:
Für den Einsatz der SHELL-Instruktion sprechen diese Vorzüge, die in einer Shell verfügbar sind:
Quoting
Ab Gambas 3 kann man mit der Funktion Shell$(Shell-Befehl-String) eine sichere Übergabe an die Shell realisieren, damit bestimmte Zeichen im Shell-Befehl-String von der verwendeten Shell – bei Ubuntu ist das '/bin/dash' – nicht interpretiert werden. Für EXEC ist ein Maskieren ausgewählter Zeichen nicht erforderlich. Unter der folgenden URL finden Sie gut aufbereitete Informationen zum Quoting: http://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfänger .
Die SHELL-Instruktion und die EXEC-Instruktion starten beide ein externes Programm – ein Prozess wird erzeugt. Wesentliche Eigenschaften, Methoden und Events sowie ausgewählte Konstanten der Klasse 'Process' sind im Kapitel 21.1 beschrieben worden. Im folgenden Kapitel 21.3 werden zuerst der Einsatz der Event-Handler PEventName_Read(), PEventName_Kill() und PEventName_Error(..) beschrieben. Um Eingaben an den Prozess übergeben, werden dafür entsprechende Prozeduren vorgestellt. Diese Beschreibungen gelten für die beiden Instruktionen SHELL und EXEC in gleicher Weise.
Artikel