Auf gute Zusammenarbeit – wer Shellbefehle miteinander kombiniert, spielt die ganze Stärke der Kommandozeile aus. Dazu gehört nicht nur das Verketten einzelner Programme, sondern auch das Weiterleiten der Ausgaben: Scrollen die Informationen beispielsweise zu schnell über den Bildschirm, leiten Sie diese einfach in eine Datei um oder zeigen Sie seitenweise an.
Gut kombiniert
Mit wenigen Handgriffen verknüpfen Sie in der Bash einzelne Befehle miteinander. Anstelle von
$ mkdir replaceableOrdner $ cd replaceableOrdner $ cp ../replaceableOrdner2/* .
kombinieren Sie die einzelnen Arbeitsschritte und teilen dem Interpreter über das Semikolon mit, dass er alle Befehle direkt hintereinander ausführen soll:
$ mkdir replaceableOrdner ; cd replaceableOrdner ; cp ../replaceableOrdner2/* .
Noch mehr Kontrolle erhalten Sie, wenn Sie der Bash eine Bedingung stellen. So ist es beispielsweise möglich, einen zweiten (oder dritten oder n-ten) Befehl nur dann auszuführen, wenn ein anderes Kommando erfolgreich oder nicht erfolgreich war.
Um beispielsweise eine bestimmte Datei nur dann zu löschen, wenn sie vorhanden ist, stellen Sie dem Kommando Rm einen einfachen Test voran:
test -w replaceableDatei && rm replaceableDatei
Das gleichnamige Programm Test schaut in diesem Fall nach, ob die Datei existiert und schreibbar ist (Parameter -w); nur wenn das der Fall ist, löscht Rm diese. Wer häufig Software aus den Quellen baut und dabei den Dreierschritt ./configure; make; make install einsetzt, kann alle drei Befehle miteinander kombinieren und durch && sicherstellen, dass jeder folgende Befehl nur weitermacht, wenn der Vorgänger keine Fehler produziert hat:
./configure && make && make install
Neben der Option -w hat das Test-Kommando noch einige weitere praktische Flags zu bieten. So schauen Sie zum Beispiel mit -d nach, ob ein Verzeichnis schon existiert, und nur wenn dieses nicht der Fall ist, erstellen Sie es:
test -d replaceableOrdner || mkdir replaceableOrdner
Dabei übernehmen die zwei Pipezeichen zwischen den Befehlen die Funktion eines logischen Oder.
Kanalsystem
Insgesamt drei Kanäle gibt es für die Ein- und Ausgabe von Befehlen auf der Shell: Programme lesen ihre Daten von der Standardeingabe (STDIN, Kanal 0) oder aus einer Datei, die Programmausgaben landen auf der Standardausgabe (STDOUT, Kanal 1), und Fehlermeldungen werden auf die Standardfehlerausgabe (STDERR, Kanal 2) geschrieben:
replaceableBefehl < replaceableEingabe > replaceableAusgabe 2>replaceableFehler
Die Operatoren < und > verraten dabei die Richtung: Erfolgt die Standardeingabe nicht über die Tastatur, sorgt < dafür, dass der Befehl sie beispielsweise aus einer Datei einliest. Um hingegen die Ausgabe eines Kommandos in eine Datei umzuleiten, dient der Operator >. Die Fehlerausgabe erreichen Sie ebenfalls über >, allerdings spezifizieren Sie hier den Kanal durch Voranstellen des File Descriptors (2>). Tabelle "Shell-Umleitungen" zeigt eine Übersicht der gebräuchlichsten Umleitungsszenarien, und die folgenden Abschnitte zeigen detaillierte Anwendungsbeispiele.
Shell-Umleitungen
| Kanal | Kommando | Ergebnis |
|---|---|---|
| 1 (stdout) | replaceableBefehl > replaceableDatei
|
Schreibt die Standardausgabe von replaceableBefehl in replaceableDatei.
|
| 1 (stdout) | replaceableBefehl >> replaceableDatei
|
Hängt die Standardausgabe von replaceableBefehl an replaceableDatei an.
|
| 2 (stderr) | replaceableBefehl 2> replaceableDatei
|
Lenkt die Standardfehlerausgabe von replaceableBefehl in replaceableDatei um.
|
| 2 (stderr) | replaceableBefehl 2>> replaceableDatei
|
Hängt die Standardfehlerausgabe von replaceableBefehl an replaceableDatei an.
|
| 1 (stdout) und 2 (stderr) | replaceableBefehl > replaceableDatei 2>&1
|
Schreibt Standardausgabe und Standardfehlerausgabe von replaceableBefehl in dieselbe replaceableDatei.
|
| 1 (stdout) und 2 (stderr) | replaceableBefehl > replaceableDatei 2> replaceableDatei2
|
Standardausgabe von replaceableBefehl landet in replaceableDatei, die Standardfehlerausgabe schreibt die Shell nach replaceableDatei2 geschrieben.
|
| 0 (stdin) | replaceableBefehl < replaceableDatei
|
Leitet replaceableDatei in Standardeingabe von replaceableBefehl um.
|


