Inhaltsverzeichnis

21.2 Instruktionen SHELL und EXEC

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.

21.2.1 Syntax SHELL

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.

21.2.2 Syntax EXEC

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!

21.2.3 Syntax-Erweiterung – Umgebungsvariablen

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

21.2.4 Vergleichende Betrachtungen zu den Instruktionen SHELL und EXEC

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.

21.2.4.1 Unterschiede SHELL – EXEC

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 .

21.2.4.2 Gemeinsamkeiten SHELL – EXEC

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.

Download

Artikel

Download