Aus Raspberry Pi Geek 08/2022

Datenströme mit Pipes umleiten

© lightwise / 123RF.com

Hier entlang!

Jörg Schorn

Umleitungen, auf der Shell Pipes genannt, bieten eine überraschende Vielfalt an Möglichkeiten.

Sobald unter Linux ein Prozess startet, bekommt er automatisch drei Kanäle zugewiesen. Diese lassen sich über die vom System zugewiesenen Kanäle ansprechen und besitzen jeweils einen Ursprungs- und einen Endpunkt. Kanal 0 (STDIN) kommt beim Einlesen von Daten zum Zug, Kanal 1 (STDOUT) dient der Ausgabe von Daten, und Kanal 2 (STDERR) gibt mögliche Fehlermeldungen aus. Üblicherweise zeigt Kanal 2 auf dasselbe Gerät wie Kanal 1 (Abbildung 1).

Abbildung 1: Die Shell liest von der Tastatur die Eingaben ein (STDIN, Kanal 0) und die Ergebnisse auf dem Bildschirm aus (STDOUT, Kanal 1). Fehlermeldungen erscheinen via STDERR (Kanal 2).

Abbildung 1: Die Shell liest von der Tastatur die Eingaben ein (STDIN, Kanal 0) und die Ergebnisse auf dem Bildschirm aus (STDOUT, Kanal 1). Fehlermeldungen erscheinen via STDERR (Kanal 2).

Die Shell selbst stellt ebenfalls einen Unix-Prozess dar und verwendet ebenso diese drei Kanäle. Jeder davon lässt sich über einen File-Deskriptor ansprechen, der die jeweilige Kanalnummer repräsentiert. Unter Linux finden sich die verwendeten Kanäle im Verzeichnis /proc/PID/fd, wobei PID der Prozess-ID des zu untersuchenden Prozesses entspricht.

Die unter Linux am häufigsten verwendete Shell Bash stellt zusätzlich noch den Kanal 255 bereit. Um beim Umlenken dieses Kanals weiterhin die Job-Kontrolle zu behalten, setzt ihn die Shell beim Start auf STDERR.

Der Artikel bezieht sich im Folgenden in weiten Teilen auf die Skripte funktionen und read.awk, die Sie im Download-Bereich zu diesem Artikel finden.

Umlenkung

Eine Umlenkung liest Kanäle eines Prozesses von einer anderen Quelle ein oder gibt sie auf ein anderes Ziel aus. Die wahrscheinlich am häufigsten genutzten Anwendungsfälle betreffen das Suchen einer Zeichenkette aus dem Fehlerkanal und das Umleiten von Fehlermeldungen in das Device /dev/null.

Der Aufruf aus der ersten Zeile von Listing 1 versucht, das nicht existente Verzeichnis /dev/pseudo/ anzuzeigen, was eine Fehlermeldung auf Kanal 2 erzeugt. Der Aufruf aus der letzten Zeile ergänzt das Kommando um eine Umleitung von Kanal 2 nach /dev/null. Die Fehlermeldung erscheint nun nicht mehr auf dem Bildschirm, der Rückgabewert des Kommandos bleibt jedoch unverändert.

Listing 1

Rückgabe umleiten

# ls -ld /dev/pseudo
ls: cannot access /dev/pseudo: No such file or directory
# ls -ld /dev/pseudo 2>/dev/null

Pipes

Eine Pipe stellt eine besondere Art einer Datei dar, die als FIFO-Speicher zur Interprozesskommunikation dient. Wenn zum Beispiel Prozess 1 die Werte 1 Z 2 Y 3 X 4 W 5 V in eine Pipe schreibt, liest Prozess 2 diese auch so aus der Pipe aus. Linux stellt zwei Arten von Pipes bereit: anonyme und die benannte.

Anonyme Pipes dienen zum Aneinanderreihen von Kommandos, die das Pipe-Symbol (|) verbindet. Man spricht von anonymen Pipes, da der Nutzer diese zur Laufzeit üblicherweise nicht sieht. Die anonymen Pipes befinden sich wie die Standardkanäle im Verzeichnis /proc/PID/fd/. Der Aufruf einer Kommandokette generiert temporär diese Art von Pipe.

Die benannten Pipes lassen sich mit dem Kommando mkfifo im Dateisystem anlegen und bleiben so lange erhalten, bis man sie mittels rm wieder löscht. Beim Umgang mit benannten Pipes müssen Sie selbst für die entsprechende Umlenkung der Ein- und Ausgabekanäle sorgen, was bei den anonymen Pipes die Shell automatisch handhabt.

Pipes einsetzen

Als versierter Linux-User kennen Sie wahrscheinlich das Verwenden von Pipes. Das folgende Beispiel ermittelt alle Unterverzeichnisse des Verzeichnisses, in dem Sie es aufrufen, und zählt sie:

$ ls -l | grep "^d" | wc -l
138

Die Ausgabe des Aufrufs von ls führt in den Eingabekanal des Kommandos grep, dessen Ausgabe wiederum in der Eingabe des Befehls wc landet (Abbildung 2).

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben