Pipeline: Datenfluß durch mehrere Kommandos

Eine Pipeline besteht aus einem oder mehreren einfachen Kommandos, die (falls es mehrere sind) durch das pipeline symbol (das ist das Zeichen |) getrennt sind.

Alle Kommandos einer Pipeline laufen gleichzeitig, wobei das erste Kommando die normale Standardeingabe zu sehen bekommt, während alle anderen Kommandos als Eingabe jeweils die Standardausgabe ihres vorhergehenden Kommandos erhalten. Die Standardausgabe des letzten Kommandos der Pipeline wird dann zur Ausgabe der gesamten Pipeline.

Die Standardfehlerausgabe aller Kommandos wird durch diesen Mechanismus nicht beeinflußt.

Beispiel 9   Die Eingabe wird nacheinander durch drei Kommandos gefiltert: ein sed, welches alle zerronnen durch vergoren ersetzt, dann ein fgrep, welches nur Zeilen passieren läßt, die den Text gewonnen enthalten, und dann ein weiteres sed, welches gewonnen durch verloren ersetzt (die lange Eingabezeile ist mit einem \ umgebrochen, damit sie auf die Seite paßt):
klaus@aw35: ~ > sed -e s/zerronnen/vergoren/ | \
fgrep gewonnen | sed -e s/gewonnen/verloren/
wir haben die Wahl gewonnen!
die anderen sind die schlechteren
Wie gewonnen, so zerronnen.
wir haben die Wahl verloren!
Wie verloren, so vergoren.

Anmerkung: Durch die interne Pufferung wird jetzt nicht mehr nach jeder Eingabezeile sofort die Ausgabe sichtbar, sondern erst nach dem Ende der Eingabe mit Strg-D. Dies hat aber auf die beschriebenen Mechanismen keinen weiteren Einfluß. Aber in jedem Fall kann man sich nicht darauf verlassen, wann die Ausgabe (bezogen auf die Eingabe) erfolgt. Allerdings kann man sich darauf verlassen, daß die Reihenfolge innerhalb des Eingabestroms und innerhalb der Ausgabeströme von der Shell nicht manipuliert wird.

(Man kann sich zum Verständnis eine Pipeline auch so vorstellen, daß das erste Kommando wie üblich aufgerufen wird, aber seine gesamte Ausgabe irgendwo heimlich gesammelt wird. Anschließend wird das zweite Kommando aufgerufen, und mit der gesammelten Ausgabe des Vorgängers gefüttert, wobei dessen Ausgabe wiederum gesammelt wird, und so weiter.)

Damit können mehrere Kommandos zu einem komplexeren zusammengefaßt werden, und erscheinen von außen betrachtet wieder wie ein Kommando.

Optional darf vor der gesamten Pipeline noch
time
oder
time -p
geschrieben werden.

Dadurch wird die anschließend angegebene Pipeline wie üblich ausgeführt, und zuletzt die verbrauchte Rechen- und Gesamtzeit ausgegeben.

In der -p-Variante erfolgt diese Ausgabe nach POSIX-Standard (in der bash).

Tip: Wenn man in einer Pipeline wissen möchte, was zwischen zwei Kommandos übertragen wird, kann man das leicht protokollieren. Dazu gibt es das Kommando tee (gesprochen wie der englische Buchstabe T). Es wird mit einem Dateinamen aufgerufen, und funktioniert wie ein T-Stück in der Pipeline: alles, was zu seiner Eingabe kommt, wird sowohl unverändert zur Ausgabe kopiert, als auch in die angegebene Datei geschrieben:
...kommando_n-1 | tee a.log | kommando_n...
erzeugt in der Datei a.log eine Kopie der Daten, die von kommando_n-1 nach kommando_n fließen.

AnyWare@Wachtler.de