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