Umleitungen und Pipes

Noch etwas über Prozesse

Um das Prinzip der Umleitungen und Pipes richtig zu verstehen müssen wir vorher einen Aspekt der Prozesse behandeln, um den wir uns bisher nicht gekümmert haben. Die meisten UNIX®-Prozesse (inklusive grafische Anwendungen aber exklusive der meisten Demons) benutzen mindestens drei Datei-Werte: Standard-Eingabe, Standard-Ausgabe und Standard-Fehler. Die entsprechenden Nummern lauten 0, 1 und 2. Im Allgemeinen gehören diese drei Werte zu dem jeweiligen Terminal, in dem der Prozess gestartet wurde, wobei die Eingabe durch die Tastatur vorgenommen wird. Das Ziel der Umleitungen und Pipes ist die Umleitung dieser Rückgabe-Werte. Die Beispiele in diesem Abschnitt sollen dieses Prinzip veranschaulichen.

Umleitungen

Nehmen wir an, Sie wollen eine Liste der Dateien mit der Endung .png [6] im Verzeichnis images aufstellen. Da diese Liste sehr umfangreich ist wollen Sie sie in einer Datei speichern um sich die Aufstellung später in Ruhe anzusehen. Dazu geben Sie den folgenden Befehl ein:

$ ls images/*.png 1>file_list

Die Standard-Ausgabe dieses Befehls (1) wird also umgeleitet (>) in eine Datei file_list. Der Operator > ist dabei der Ausgabe-Umleiter. Falls die Umleitungsdatei nicht existiert wird sie angelegt, fals sie bereits existiert, wird ihr Inhalt durch die Ausgabe des Befehls überschrieben. Der Standard-Wert (1) ist jedoch vorgegeben und muss nicht gesondert spezifiziert werden. Also können Sie in diesem Fall vereifacht schreiben:

$ ls images/*.png >file_list

und das Resultat wird das Gleiche sein. Anschließend können Sie sich die Datei mit einem Datei-Anzeiger wie z.B. less anschauen.

Wenn Sie nun wissen wollen, wieviele solcher Dateien (in diesem Beispiel) existieren, müssen Sie nicht mühsam anfangen zu zahlen, dazu gibt es den Befehl wc (engl. Word Count) mit der Option -l, die Ihnen die Anzahl der Zeilen einer Datei in der Standard-Ausgabe angibt. Eine mögliche Verwendung wäre:

wc -l 0<file_list

und Sie erhalten die gewünschte Anzeige. Der Operand < ist der Umleiter der Eingabe und der standardmäßige Descriptor dazu ist 0 (Standard-Eingabe). Also lautet der vereinfachte Befehl:

wc -l <file_list

Jetzt wollen Sie alle Dateinamen-„Erweiterungen“ entfernen und das Ergebnis in einer anderen Datei speichern. Das hierfür ideale Werkzeug ist sed (Stream EDitor). Sie leiten also die Standard-Eingabe des Befehls sed auf die Datei file_list und die Ausgabe in die Zieldatei, z.B. the_list:

sed -e 's/\.png$//g' <file_list >the_list

Nun wurde die Liste erstellt und Sie können Sie in Ruhe mit dem Betrachter Ihrer Wahl ansehen.

Sehr hilfreich kann die Umleitung von Standard-Fehlermeldungen sein. Sie wollen z.B. wissen, auf welche Unterverzeichnisse Sie im Verzeichnis /shared nicht zugreifen können? Eine der möglichen Lösungen ist das rekursive Auflisten dieses Verzeichnisses wobeiSie die Fehlermeldungen in eine Datei umleiten und die Standard-Ausgabe nicht anzeigen:

ls -R /shared >/dev/null 2>errors

Dies bedeutet im Einzelnen, dass die Standard-Ausgabe umgeleitet wird (>) in die Datei /dev/null, eine spezielle Datei, deren Inhalt sofort entsorgt wird (d.h., die Standard-Ausgabe wird nicht angezeigt), und die Standard-Fehler (2) werden umgeleitet (>) nach errors.

Pipes

Pipes sind eine Art Kombination von Eingabe- und Ausgabe-Umleitung. Das Prinzip gleicht dem einer physikalischen Röhre, daher der Name: ein Prozess sendet Daten in das eine Ende der Röhre und ein anderer Prozess liest diese Daten am anderen Ende aus. Das Zeichen für eine Pipe ist |. Gehen wir zu unserem Beispiel von eben zurück und nehmen wir an, Sie wollen sofort wissen, wieviele Dateien mit der Endung .png vorkommen, ohne den Umweg über eine temporäre Datei zu nehmen. Dazu benutzen Sie eine Pipe mit folgendem Befehl:

ls images/*.png | wc -l

Dabei wird die Standard-Ausgabe des Befehls ls (also die Dateiliste) auf die Standard-Eingabe des Befehls wc umgeleitet und ergibt sofort das gewünschte Resultat.

Auch die Zusammenstellung der Dateien „ohne Namenserweiterungen“ funktioniert auf diese Weise:

ls images/*.png | sed -e 's/\.png$//g' >the_list

oder, falls Sie die Liste ansehen wollen ohne sie in einer Datei zu speichern:

ls images/*.png | sed -e 's/\.png$//g' | less

Pipes und Umleitungen sind aber in ihrer Funktion nicht auf lesbaren Text beschränkt. Der folgende Befehl, eingegeben in einem Terminal:

xwd -root | convert - ~/my_desktop.png

wird beispielsweise einen Screenshot Ihres Desktops in die Datei my_desktop.png [7] in Ihrem persönlichen Verzeichnis abspeichern.



[6] Sie nehmen jetzt vermutlich an, dass man anstatt „Dateien mit der Endung .png“ doch einfacher „PNG-Bilder“ sagen könnte. Jedoch sollten Sie sich nochmals merken, dass Dateien unter UNIX® die üblichen Endungen nur aus Bequemlichkeit haben, die Endungen definieren nicht den Dateityp. Eine Datei mit der Endung .png kann also durchaus eine JPEG-Grafik, eine Programmdatei, eine Textdatei oder jede beliebige andere Dateiart sein. Das gilt auch für Windows®!

[7] Ja, ein richtiges PNG-Bild (allerdings muss dazu das Programm ImageMagick installiert sein...).