2.4. Ein- und Ausgabeumleitung

2.4.1. Etwas mehr über Prozesse

Das Prinzip der Ein- und Ausgabeumleitung ist mit dem Begriff des Prozesses verknüpft, der bisher noch nicht erläutert worden ist.

Jeder Unix-Prozess (auch grafische Anwendungen) öffnet mindestens die drei folgenden Dateideskriptoren: Standardeingabe (stdin), Standardausgabe (stdout) und Standardfehlerausgabe (stderr). Ihre Nummern sind 0, 1 und 2. Üblicherweise sind diese Deskriptoren mit dem Terminal verbunden, von dem aus der Prozess gestartet wurde, mit der Tastatur als Eingabe. Ein- und Ausgabeumleitung befasst sich nun mit dem Umlenken dieser Deskriptoren. Keine Sorge, einige Beispiele werden die Sache anschaulicher machen.

2.4.2. Umleitungen

Stellen Sie sich vor, Sie möchten eine Liste der Dateien im Verzeichnis images, die auf .png enden.[1] Diese Liste ist sehr lang und Sie wollen sie daher in einer Datei speichern. Verfahren Sie folgendermaßen:

ls images/*.png 1>datei_liste

Das heißt, dass die Standardausgabe dieses Kommandos (1) umgeleitet wird (>) in eine Datei namens datei_liste. (>) ist der Operator für die Ausgabeumleitung. Wenn die Zieldatei nicht existiert, wird sie erstellt, existierende Dateien werden überschrieben. Da der Operator standardmäßig den Deskriptor für die Standardausgabe umleitet, brauchen Sie ihn (die 1) gar nicht anzugeben:

$ ls images/*.png >datei_liste

Das Ergebnis ist genau das selbe. Jetzt können Sie sich die neue Datei mittels less ansehen.

Angenommen, Sie möchten wissen, wie viele Dateien in datei_liste aufgelistet werden. Sie brauchen das nicht selbst zu zählen. Verwenden Sie dafür das Programm wc (Word Count, engl. für ,,Wörterzählung``) mit der option -l, die dafür sorgt, dass die Zeilenanzahl ausgegeben wird. Folgender Befehl liefert also das gewünschte Ergebnis:

wc -l 0<datei_liste

,,<`` ist der Operator zur Umleitung der Eingabe, und ähnlich wie oben ist der umgeleitete Deskriptor der für die Standardeingabe, also 0. Daher können Sie das Kommando wieder etwas abkürzen:

wc -l <datei_liste

Angenommen, Sie wollen diese Liste dahingehend verändern, dass die Einträge keine ,,Dateiendungen`` mehr haben, können Sie dies mit einem Kommando namens sed (Stream EDitor, engl. für ,,Datenstrom-Editor``) erreichen. Als Standardeingabe für sed leiten Sie die Datei datei_liste in den Befehl und die Standardausgabe in eine Datei, beispielsweise liste, um:

sed -e 's/\.png$//g' <datei_liste >liste

Jetzt können Sie sich die neue Liste anschauen.

Mit diesem Mechanismus können Sie auch die Standardfehler-Ausga­be umleiten. Angenommen, Sie möchten wissen, auf welche Verzeichnisse in /shared Sie nicht zugreifen können, besteht eine Möglichkeit darin, dieses Verzeichnis rekursiv aufzulisten, die Fehlerausgabe in eine Datei und die Standardausgabe in eine Art ,,Mülleimer`` umzuleiten:

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

Die Standardausgabe (>) wird nach /dev/null umgeleitet, dem Unix-,,Mülleimer`` und erscheint nicht auf dem Schirm. Die Standardfehler-Ausgabe (2) wird in die Datei fehler umgeleitet (>).

2.4.3. Röhren

,,Röhren`` (in Englisch pipes) kombinieren die Ein- und Ausgabeumleitung. Das Prinzip ist das einer Röhre, daher der Name: ein Prozess sendet Daten in das eine Ende der Röhre und ein anderer Prozess liest diese am anderen Ende. Der zuständige Operator ist |. Zurück zu dem Beispiel der Dateiliste: angenommen, Sie möchten die Anzahl der Dateien direkt erfahren, ohne die Liste vorher abspeichern zu müssen. Das geht folgendermaßen:

ls images/*.png | wc -l

Die Standardausgabe von ls (also die Dateiliste) wird auf die Standardeingabe von wc umgelenkt. Dies ergibt dann das gewünschte Ergebnis.

Das selbe funktioniert auch für eine Liste ohne ,,Dateiendungen``:

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

oder, wenn Sie die Liste ohne Abspeichern direkt ausgeben wollen:

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

Röhren und Umleitungen sind nicht auf lesbaren Text beschränkt. Dieses Kommando, geschrieben in einer Konsole:

xwd -root | convert - ~/mein_bildschirm.png

 

 

sendet eine Aufnahme Ihres aktuellen Bildschirms an die Datei mein_bildschirm.png.[2]

Fußnoten

[1]

Es mag Ihnen etwas seltsam vorkommen, dass hier von ,,Dateien``, die auf .png enden und nicht von ,,PNG-Bildern`` die Rede ist. Denken Sie daran, dass Dateiendungen in Unix nicht zur Definition des Datei-Typs dienen. Eine Datei mit der Endung .png kann ebensogut ein JPEG-Bild sein oder eine Textdatei oder ähnliches.

[2]

Probieren Sie es aus! Es klappt wirklich :-) (voausgesetzt Sie haben das RPM-Paket ,,ImageMagick`` installiert...) Sie finden die Datei dann in Ihrem Heim-Verzeichnis.


Tux on Star from MandrakeSoft Linux ist ein eingetragenes Warenzeichen von Linus Torvalds. Alle anderen Warenzeichen und Copyrights sind das Eigentum ihrer Inhaber.
Sofern nichts anderes Angaben ist, unterliegen die Inhalte der Seiten sowie alle Bilder dem Copyright von MandrakeSoft S.A. und MandrakeSoft Inc. 2000.
http://www.linux-mandrake.com/