claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 09/2005   »   Ausgabe bestellen

Umleitungsoperatoren

Genial gelenkig

von Heike Jurzik


Mit verschiedenen Operatoren leiten Sie Ein- und Ausgabe von Programmen auf der Kommandozeile um. Welche Handgriffe dazu nötig sind und wie Sie Befehle geschickt miteinander verketten, zeigt dieser Artikel.

Woher Befehle ihre Daten beziehen und wo sie die Ausgabe hinschreiben, bestimmen Sie selbst -- Umleitungs-Operatoren sorgen für mehr Flexibilität beim Arbeiten auf der Shell, und dank Pipes ist es sogar möglich, die Ausgabe von Programmen direkt an andere Befehle weiterzugeben. Wir zeigen, wie Sie auf der Kommandozeile gelenkig bleiben.

Kanalsystem

Mit drei Kanälen haben Sie es zu tun, wenn Sie auf der Kommandozeile arbeiten: So erwarten Programme ihren Input von der Standardeingabe (abgekürzt: stdin). Das kann beispielsweise über die Tastatur geschehen, wenn Sie für ein Programm Daten zur Verfügung stellen.

Das Ganze lässt sich mit einem simplen Beispiel sehr leicht nachvollziehen. Das Programm sort, das Zeilen sortiert, liest u. a. direkt von der Standardeingabe. Rufen Sie den Befehl am Shell-Prompt auf, wartet er auf Daten. Tippen Sie los und geben Sie Worte ein, die das Programm sorieren soll:

$ sort
Küken
Hahn
Huhn

Beenden Sie die Eingabe mit [Strg-D], gibt sort eine geordnete Liste der Begriffe aus:

Hahn
Huhn
Küken

Die Ausgabe des Kommandos ist hier auf der Konsole gelandet -- diese ist für alle in der Shell gestarteten Programme im Normalfall die so genannte Standardausgabe (stdout). Auch die meisten anderen Kommandos schreiben auf die Standardausgabe, z. B. könnte der ls-Befehl Folgendes anzeigen:

$ ls /home/huhn
Desktop/   Documents/  OpenOffice.org/
...

Immer, wenn etwas "schief geht" und ein Prozess eine Fehlermeldung ausgibt, schreibt er auf die Standardfehlerausgabe (stderr) -- auch die ist standardmäßig mit der aktiven Konsole verbunden. Besitzen Sie beispielsweise nicht die nötigen Zugriffsrechte, das Home-Verzeichnis eines Benutzers anzuschauen, informiert die Fehlerausgabe:

ls /home/hahn
ls: /home/hahn/: Keine Berechtigung

Die drei Standardkanäle besitzen zur Identifizierung Nummern, so genannte File Descriptors, die in den Beispielen der folgenden Abschnitte auch immer wieder eine Rolle spielen werden:

Anders ausgeben

Durch den Einsatz von so genannten Operatoren geben Sie den Kanälen eine andere Richtung vor. So ist es problemlos möglich, die Ausgabe eines Programmes nicht im Terminal zu betrachten, sondern in eine Datei zu speichern. Um beispielsweise eine Ausgabe des ls-Befehls, der auf alle Home-Verzeichnisse losgelassen wird, in der Datei home.txt abzulegen, tippen Sie:

ls /home/* > home.txt

Einen Haken hat die Umleitung mit > allerdings -- existiert die Datei home.txt schon, überschreiben Sie diese so mit den neuen Daten. Wollen Sie auf Nummer sicher gehen, verdoppeln Sie daher den Operator -- >> legt die Datei an, wenn sie noch nicht existiert, und hängt andernfalls die Daten einfach ans Ende an:

ls /home/* >> home.txt

Für das sort-Beispiel des Abschnitts "Kanalsystem" bedeutet dieses Feature direkt einen Arbeitsschritt weniger: Statt die sortierte Wortliste aus der Ausgabe zu kopieren und diese in einem weiteren Schritt in eine neue Datei einzufügen, können Sie im Aufruf selbst schon angeben, wohin die Ausgabe gespeichert werden soll. Tippen Sie

sort > sortiert.txt

gefolgt von [Eingabe]. Schreiben Sie nun die Wortliste ins Terminal und beenden Sie die Eingabe wieder durch [Strg-D]. Die sortierte Liste befindet sich anschließend in der Datei sortiert.txt (Abbildung 1).

Abb. 1: Spart Zeit: Mit dem Umleitungsoperator schreiben Sie die sortierte Liste direkt in eine Datei.

Fehler in der Leitung

Auch für die Fehlerausgabe kann diese Umleitungsmöglichkeit wichtig sein. Mit dem Umleitungsoperator, den Sie aus dem vorhergehenden Abschnitt schon kennen, fangen Sie auch Fehlermeldungen ab. Da die Standardausgabe als File Descriptor die 1 hat, könnten Sie im vorhergehenden Beispiel alternativ auch

ls /home/* 1> home.txt

bzw.

ls /home/* 1>> home.txt

schreiben. Lassen Sie den File Descriptor weg, ist automatisch stdout gemeint. Um also stderr von der Konsole wegzufischen, setzen Sie die Ziffer 2 vor den Operator. Listen Sie wie im vorigen Beispiel den Inhalt aller Home-Verzeichnisse auf, sind Teile davon nicht lesbar und wollen Sie nicht jedes Mal über fehlende Zugriffsrechte informiert werden, schreiben Sie beispielsweise

ls /home/* 2> /dev/null

Hier leiten Sie die Fehlerausgabe nicht in eine Datei, sondern nach /dev/null um, das ist eine "Pseudo-Datei" ohne Inhalt. Alles, was Sie hierhin umlenken, wird ignoriert, und unerwünschte Fehlermeldungen lassen sich so geschickt aus der Welt schaffen. Alles Andere erscheint in diesem Beispiel wieder auf der Standardausgabe. Um den Inhalt der lesbaren Verzeichnisse in einer Datei abzuspeichern und die Fehler wegzuwerfen, kombinieren Sie die Operatoren wie folgt:

ls /home/* >> home.txt 2> /dev/null

Soll die Fehlerausgabe hingegen nicht verschwinden, sondern zusammen mit der Standardausgabe abgelegt werden, setzen Sie ein Kaufmannsund-Zeichen nach den Operator:

ls /home/* >& datei

In der Zieldatei finden Sie anschließend nicht nur den Inhalt der Home-Verzeichnisse, sondern auch alle Fehlermeldungen, die sonst standardmäßig auf der Konsole landen.

Eine neue Eingebung

Nicht nur die Ausgabe und die Fehler lassen sich umleiten, sondern auch die Standardeingabe. Auf diese Weise erhält ein Programm seine Daten nicht über die Tastatur, sondern aus einer Datei. Für das sort-Beispiel heißt das etwa, dass Sie die unsortierten Begriffe einfach aus einer Datei an das Programm übergeben können. Das Ergebnis der Aufräumarbeiten sehen Sie dabei wiederum auf der Standardausgabe:

sort < unsortiert.txt
Easter
Jones
Kiwi
Peggy
Petronella

Da die meisten Programme (sort eingeschlossen) sich genauso verhalten, wenn Sie sie einfach direkt mit dem Namen der zu bearbeitenden Daten aufrufen (sort unsortiert.txt tut dasselbe), müssen Sie die einzulesende Datei nicht explizit über < zur Eingabe machen -- sinnvoll ist der <-Operator aber bei vielen Programmen, die typischerweise interaktiv arbeiten und nicht mit einer Eingabedatei rechnen, z. B. ftp.

In die Röhre schauen

Natürlich ist es praktisch, die Ausgabe von Kommandos in Dateien zu speichern und diese nachträglich anzuschauen. Eine lange Liste von Dateien in den verschiedenen Home-Verzeichnissen kann man so in Ruhe betrachten und durchsuchen.

Um diese Aufgabe noch weiter abzukürzen, können Sie mit so genannten Pipes tricksen. Das Pipe-Zeichen | erreichen Sie auf deutschen Tastaturen in der Regel über die Tastenkombination [AltGr-<] -- es sieht wie ein Verbindungsstück aus, und genau diese Aufgabe erfüllt die Pipe auch. Soll die Ausgabe eines Kommandos zur Eingabe für den nächsten Befehl werden, setzen Sie eine Pipe dazwischen:

ls /home/* | less

Hier arbeiten die beiden Programme ls und less Hand in Hand: Die Standardausgabe von ls wird zur Standardeingabe von less, und Sie können auf diese Weise das Ergebnis des ersten Befehls seitenweise betrachten. (Das Programm less beenden Sie übrigens mit Druck auf [Q].)

Es ist problemlos möglich, mehrere Befehle durch Pipes miteinander zu verbinden und so die Ausgaben immer wieder weiterzureichen. Wer als Administrator herausfinden möchte, welche Dateien in den einzelnen Home-Verzeichnissen den meisten Platz verwenden, kann mit verschiedenen Kommandos, die durch Pipes miteinander verbunden werden, tricksen. Zunächst einmal benötigen Sie das Programm du (disk usage, Plattenbelegung), das Speicherfresser aufspürt. Damit Sie die Daten aller Benutzer durchforsten können, werden Sie vorher durch

su -

und Eingabe des Root-Passwortes zum Administrator. Da die einfache Ausgabe von

du /home

die Dateien einfach nur so über den Bildschirm fliegen lässt, können Sie wiederum die Ausgabe über eine Pipe an das Kommando less weiterreichen und seitenweise betrachten:

du /home | less

Auf diese Weise haben Sie allerdings die Ausgabe noch nicht sortiert. Hier kommt wieder das Programm sort zum Einsatz, das Sie einfach zwischenschalten:

# du /home | sort -rn | less
67385372        /home
25027588        /home/suse9
12770616        /home/transpluto
12770412        /home/transpluto/tape_backup
...

Die beiden Parameter -r und -n, die Sie sort mit auf den Weg geben, sorgen dafür, dass das Tool numerisch sortiert (n) und das Ergebnis in umgekehrter Reihenfolge (also die größten Nummern zuerst) präsentiert (r). (hge)

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2017 COMPUTEC MEDIA GmbH | Last modified: 2007-04-05 11:10

Nutzungsbasierte Onlinewerbung

[Linux-Magazin] [LinuxUser] [Linux-Community] [Admin-Magazin] [Ubuntu User] [Smart Developer] [Linux Events] [Linux Magazine] [Ubuntu User] [Admin Magazine] [Smart Developer] [Linux Magazine Poland] [Linux Community Poland] [Linux Magazine Brasil] [Linux Magazine Spain] [Linux Technical Review]