Bitte warten...

Bash: Unterprozesse

Die Bash ist im Funktionsumfang von Hause aus recht einfach gehalten. Dies wird durch den Umstand kompensiert, dass sie dafür ausgelegt ist, leicht auf die Vielzahl an weiteren externen Shell-Kommandos zugreifen zu können.

Ob es sich bei einer Anweisung um ein externes Kommando oder ein internes, sogenanntes builtin handelt, lässt sich mit dem Kommando type prüfen. Bei externen Kommandos wird der Pfad zu der ausführbaren Binärdatei des Kommandos angezeigt. Die Pfade, in denen die Bash nach diesen Binärdateien sucht, um sie auszuführen, sind in der Umgebungsvariable PATH gespeichert.

Code kopieren
type test  # test ist eine von der Shell mitgelieferte Funktion.
type echo  # echo ist eine von der Shell mitgelieferte Funktion.
type cp    # cp ist /usr/bin/cp
echo $PATH

Die Frage, ob ein Kommando intern oder extern ist, ist insbesondere bei der Entwicklung von Skripten zu beachten, die möglichst plattformunabhängig sein sollen, da nicht immer davon ausgegangen werden kann, dass alle externen Kommandos auch auf allen Rechnersystemen vorhanden sind.

Unterprozesse aufrufen

Während der Aufruf eines internen Kommandos keinen Unterprozess erzeugt, da er innerhalb der Bash selbst ausgeführt wird, werden externe Kommandos als Unterprozess ausgeführt. Dies ist nicht unbedingt sofort zu erkennen, da die Notation diesen Unterschied nicht zwangsläufig sichtbar macht.

Jeder Prozess gibt in der Regel einen sogenannten Return-Code zurück, der Auskunft darüber gibt, ob der Prozess fehlerfrei abgelaufen ist. Dieser Return-Code kann mit $? abgefragt werden.

Code kopieren
echo "Hallo, Welt!"
echo $?  # gibt den Return-Code des letzten Kommandos aus

Dieser Return-Code ist aber nicht unbedingt das, was wir von einem Unterprozess als Antwort verwenden wollen. Meist sind wir eher an der Ausgabe, also dem Ergebnis des Prozesses interessiert. Dieses Ergebnis erhalten wir durch die sogenannte Kommando-Expansion mit $(KOMMANDO), woran der Unterprozess nun auch zu erkennen ist. Die Kommando-Expansion kann auch mit Backticks notiert werden (s. Zeile 4).

Das folgende Beispiel illustriert drei verschiedene Wege, ein externes Kommando aufzurufen (whoami gibt den aktuellen Benutzernamen aus). In der ersten Zeile wird das Kommando direkt ausgeführt und ist kein Unterprozess der Bash, sondern eigenständig. In der zweiten Zeile wird das Kommando als Unterprozess ausgeführt und die Ausgabe an das Kommando echo übergeben. In den Zeilen 3 und 4 wird die Ausgabe des Unterprozesses zunächst in der Variable who gespeichert und dann mit echo angezeigt.

Code kopieren
whoami
echo $(whoami)
who=$(whoami); echo $who
who=`whoami`; echo $who

Verwendung von Pipelines

Im Artikel über Zahlen haben wir beispielsweise das externe Programm bc kennengelernt, mit dem mathematische Operationen durchgeführt werden können. Dabei ist bc ein komplexer Interpreter, der als Argument nicht eine einfache Operation, sondern eine Datei mit den zu verarbeitenden Operationen erwartet. Die Konsequenz daraus ist, dass bc nicht einfach beispielsweise mit a=$(bc 5.41 + 4.23) aufgerufen werden kann. Stattdessen muss mit echo erst eine Datei (oder eher: ein dateiartiger String) erzeugt werden, die zwar nicht auf der Festplatte gespeichert, aber über den Pipe-Operator | an bc zur Auswertung übergeben wird (s. auch Pipeline). Das Ergebnis wird dann an die Bash zurückgegeben und in die Variable a geschrieben:

Code kopieren
a=$(echo 5.41 + 4.23 | bc)
echo $a  # 9.64