4.8    Pipes

Pipes (|) sind mehr oder weniger mit dem Feature der Ausgabeumlenkung verwandt. Sie wurden von Ken Thompson erfunden und stellten zur Zeit der frühen UNIX-Entwicklung eine revolutionäre Vereinfachung der Programminteraktion dar.

Der Unterschied zur klassischen Ausgabeumlenkung besteht darin, dass Pipes die Ausgabe eines Kommandos nicht in eine Datei, sondern an ein weiteres Kommando leiten. Dieses zweite (und gegebenenfalls auch dritte, vierte, fünfte …) Kommando wird die Ausgabe des vorgeschalteten Programms als Eingabe betrachten. Setzen wir das oben bereits aufgeführte Mailbeispiel doch einmal via Pipe um:

# Der alte Aufruf sah wie folgt aus:
user$ mail -s Testmail swendzel@eygo.sun < Nachricht.txt

# Hier dasselbe mit Pipes:
user$ cat Nachricht.txt | mail -s Testmail swendzel@eygo.sun

Listing 4.32     Mailen via Pipe

4.8.1    Beispiel: sort und uniq verbinden

Sie haben bereits sort und uniq kennengelernt. Wenn wir die besprochene Beispieldatei sortieren und anschließend Redundanzen entfernen möchten, ohne eine Zwischendatei mit Ausgabeumleitung anzulegen (und ohne sort -u zu verwenden), dann geht das wie folgt:

user$ sort Beispieldatei | uniq
000 IP
001 ICMP
002 IGMP
003 GGP
006 TCP
012 PUP
017 UDP
022 IDP
089 OSPF
255 RAW

Listing 4.33     sortieren und Redundanzen entfernen

Prinzipiell käme auch die Kombination cat Beispieldatei | sort | uniq zum gleichen Ergebnis.

4.8.2    Beispiel: Zeichen vertauschen

Wir haben manchmal ein Dilemma mit heruntergeladenen Dateien, die wir kategorisieren wollen. Die eigentlichen Dateien des Typs befinden sich in Kleinbuchstaben auf der Platte, die heruntergeladenen haben jedoch oftmals Großbuchstaben im Namen.

Dies ist eines von den Szenarien, in denen tr Abhilfe schaffen kann. tr konvertiert ein Zeichen x in y, z. B. einen Großbuchstaben in einen Kleinbuchstaben, ein Leerzeichen in einen Unterstrich oder auch eine runde Klammer in eine eckige.

Dabei werden die zu konvertierenden Zeichen in der Form »[alt] [neu]« übergeben, zu löschende Zeichen werden durch den Parameter -d bzw. --delete, zu komplementierende durch -c bzw. --complement gekennzeichnet.

user$ cat Datei
Da-tei-in-halt
user$ cat Datei | tr -d \-
Dateiinhalt
user$ cat Datei | tr a \?
D?-tei-in-h?lt

Listing 4.34     Das Kommando tr

4.8.3    Um- und Weiterleiten mit tee

Doch was ist, wenn Sie die Ausgabe einer Pipe nicht nur weiterleiten, sondern gleichzeitig umlenken möchten? Dafür gibt es das Programm tee. Sie übergeben tee den Namen der Datei, in die die Ausgabe umgeleitet werden soll. (Die Ausgabeumlenkung funktioniert nur mit der Standard-, nicht mit der Fehlerausgabe.) Zugleich wird die Ausgabe jedoch auf dem Bildschirm (also STDOUT) ausgegeben und kann entweder in eine weitere Datei oder eine Pipe geleitet werden.

user$ wc -l kap??.tex | sort | tee output.tex | ./statistik.sh

Listing 4.35     Anwendung von tee

4.8.4    Named Pipes (FIFOs)

Named Pipes (sogenannte FIFOs) erweitern die Fähigkeiten einer Pipe. Eine FIFO kann als Datei auf dem Dateisystem erzeugt werden (was mit dem Befehl mkfifo bewerkstelligt wird) und kann Daten eines Prozesses einlesen. Das Schöne daran ist, dass mehrere Prozesse diese FIFO verwenden können.

Das FIFO-Prinzip

FIFOs arbeiten nach dem First-In-First-Out-Prinzip (daher der Name). Das bedeutet: Die Daten, die zuerst in einer FIFO abgelegt werden, werden auch zuerst wieder vom lesenden Prozess gelesen.

user$ mkfifo fifo

# In die FIFO schreiben:
$ echo Gleich sind Shellskripte an der Reihe. > fifo
# Aus der FIFO lesen:
$ cat fifo
Gleich sind Shellskripte an der Reihe.

Listing 4.36     Erstellung und Verwendung einer FIFO