Das Arbeiten auf der Shell hat viele Vorteile – abgesehen davon, dass es oft schneller geht, ein Kommando einzutippen als ein grafisches Programm zu bemühen, eröffnen Pipelines, Umleitungen und Kommandoketten zusätzliche Möglichkeiten.
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 Ordner $ cd Ordner $ cp ../Ordner2/* .
kombinieren Sie die einzelnen Arbeitsschritte und teilen dem Interpreter über das Semikolon mit, dass er alle Befehle direkt hintereinander ausführen soll:
$ mkdir Ordner ; cd Ordner ; cp ../Ordner2/* .
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 Datei && rm Datei
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 Ordner || mkdir Ordner
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:
Befehl < Eingabe > Ausgabe 2>Fehler
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) | Befehl > Datei |
Schreibt die Standardausgabe von Befehl in Datei. |
| 1 (stdout) | Befehl >> Datei |
Hängt die Standardausgabe von Befehl an Datei an. |
| 2 (stderr) | Befehl 2> Datei |
Lenkt die Standardfehlerausgabe von Befehl in Datei um. |
| 2 (stderr) | Befehl 2>> Datei |
Hängt die Standardfehlerausgabe von Befehl an Datei an. |
| 1 (stdout) und 2 (stderr) | Befehl > Datei 2>&1 |
Schreibt Standardausgabe und Standardfehlerausgabe von Befehl in dieselbe Datei. |
| 1 (stdout) und 2 (stderr) | Befehl > Datei 2> Datei2 |
Standardausgabe von Befehl landet in Datei, die Standardfehlerausgabe schreibt die Shell nach Datei2 geschrieben. |
| 0 (stdin) | Befehl < Datei |
Leitet Datei in Standardeingabe von Befehl um. |
Ausgabe umleiten
Wie schon erwähnt, leitet der Operator > die Ausgabe eines Programms in eine Datei um. Anstelle von > könnten Sie auch 1> schreiben, denn es handelt sich ja um den ersten Kanal; zwingend nötig ist die Angabe aber nicht, denn ohne weitere Angaben verwendet die Shell immer die Standardausgabe:
ls /etc > etc_inhalt.txt
Existiert die Datei hinter dem Operator bereits, überschreibt die Shell sie einfach. Einen Ausweg aus der Misere bietet der oben gezeigte Test:
test -w etc_inhalt.txt || ls /etc > etc_inhalt.txt
Alternativ verdoppeln Sie den Operator:
ls /etc >> etc_inhalt.txt
Die zwei Größerzeichen bedeuten im Klartext, dass die Shell die Ausgabe des Befehls Ls an die Datei etc_inhalt.txt anhängt, falls sie schon existiert.Falls nicht, erzeugt sie die Datei neu und schreibt die Ausgabe hinein.
Fehlermeldungen abfangen
Den zweiten Kanal leiten Sie um, indem Sie die Ziffer 2 vor den Operator > stellen. Das bietet sich vor allem dann an, wenn die Fehlermeldungen eines Programms so zahlreich über das Terminal fliegen, dass sie Sie beim Lesen der anderen Ausgaben stören.
$ find /home -name "*.tex" find: /home/lost+found: Keine Berechtigung find: /home/petronella/daten: Keine Berechtigung /home/huhn/buch/buch.tex /home/huhn/buch/kap01.tex …
Über das Kommando
find /home -name "*.tex" 2> /dev/null
schicken Sie die Fehlermeldungen an das Datengrab /dev/null auf dem Rechner, so dass diese nicht auf der Standardausgabe erscheinen.
Zwei auf einen Schlag
Ein geschicktes Kombinieren der Operatoren ermöglicht es darüber hinaus, zwei Kanäle gleichzeitig umzuleiten. Möchten Sie die Standardausgabe des eben gezeigten Find-Befehls in eine Datei schreiben ohne die ganzen Fehlermeldungen ebenfalls zu protokollieren, schreiben Sie einfach:
find /home -name "*.tex" > findausgabe 2> /dev/null
Der doppelte Operator >>, der nicht existierende Dateien erstellt oder an bestehende anhängt, darf auch in diesem Szenario zum Einsatz kommen. Wie das für die Standardausgabe geht, haben Sie schon gesehen. Auf die gleiche Weise setzen Sie den Doppelpfeil bei der Standardfehlerausgabe ein, wenn Sie die Fehler in eine Datei schreiben:
find /home -name "*.tex" > findausgabe 2>> fehler
Röhrensystem
Mit so genannten Pipes sparen Sie oft weitere Arbeitsschritte ein, indem Sie die Ausgabe eines Befehls direkt an ein anderes Programm weiterleiten, ohne den Umweg über das Umleiten in eine Datei. Dabei steht das Pipe-Zeichen ([AltGr]+[<]) zwischen den einzelnen Befehlen, wie das folgende Beispiel verdeutlicht:
ls /etc | less
Die Ausgabe von Ls erscheint nun nicht mehr im Terminal, sondern direkt im Pager Less, der sie seitenweise anzeigt und so bequemes Auf- und Abblättern ermöglicht. Besonders häufig kommt die Pipe auch zum Einsatz, um eine bestimmte Ausgabe mit Grep zusammen nach Zeichenketten zu durchsuchen, zum Beispiel:
find debian -name "*.png" | grep --color apt
Dieses Kommando fahndet im Ordner debian zunächst nach allen Dateien, die auf .png enden und leitet die Ausgabe direkt an Grep weiter. Das sucht nach der Zeichenkette apt und färbt die Treffer dank der Option --color Rot ein (Abbildung 1).
Dem Einsatz mehrerer Pipes steht nichts entgegen. Der folgende Befehl listet den Inhalt des eigenen Home-Verzeichnisses einzeilig auf, leitet das Ergebnis wieder an das Programm Grep weiter, sucht nach der Zeichenkette .jpg und zählt anschließend die Treffer:
$ ls -1 ~ | grep .jpg | wc -l 12
So finden Sie also ohne langes Suchen heraus, dass sich zwölf JPG-Dateien direkt im Home-Verzeichnis befinden.
Zeit für Tee?
Zwischen die einzelnen Pipe-Stücke bauen Sie mit dem Programm Tee einen Abzweig ein. Das Kommando erwartet Daten aus der Standardeingabe und schreibt sie sowohl in eine Datei als auch auf den Bildschirm. Ein solches T-Stück darf ganz am Ende oder zwischen den einzelnen Befehlen stehen:
Befehl1 | tee ausgabe.txt | Befehl2
Um beispielsweise ausgehend vom aktuellen Verzeichnis nach PNG-Dateien zu suchen, diese Ausgabe sowohl in der Datei bilder.txt zu protokollieren als auch anzuzeigen und mit Grep nach der Zeichenkette buch zu durchstöbern, tippen Sie beispielsweise:
find . -name "*.png" | tee bilder.txt | grep buch
Standardmäßig überschreibt Tee die angegebene Datei, falls diese bereits existiert. Um an ein vorhandenes Protokoll anzuhängen, steht der Aufrufparameter -a bereit:
find . -name "*.png" | tee -a bilder.txt | grep buch
Die verschiedenen Operatoren sowie die Pipe und der Tee-Befehl ermöglichen also eine sehr flexible Kombination von Kommandos. Für eine schnelle Suche beispielsweise lohnt sich daher meist nicht der Aufwand, ein komplettes Skript zu schreiben. Bei regelmäßigem Einsatz fließen Ihnen die Kombinationen ohnehin wie selbstverständlich aus den Fingern.






