Kommandozeile Schnellstart – Command Line Redirection

Übersicht:

Willkommen zur Lektion zum Thema Command Line Redirection. Unixoide Systeme basieren auf sogenannten Streams, die man sich als Folge von Zeichen vorstellen kann. Das Prinzip von Linux ist, dass sämtliche Anwendungsprogramme einen standardisierten Input und Output liefern. Damit ist es möglich, diese Programme hintereinander zu schalten (mehr dazu im Modul zu Pipes).

Um mit diesen Streams definiert arbeiten zu können, definiert Linux hierbei drei Standardstreams, welche fest im System verankert sind:

  • stdin - der Standardinput, Filedeskriptor 0
  • stdout - der Standardoutput, Filedeskriptor 1
  • stderr - der Standardoutput für Fehlermeldungen, Filedeskriptor 2

Jedes Anwendungsprogramm auf der Befehlszeile liest seine Daten vom Standardinput ein und gibt das Ergebnis seiner Operation an den Standardoutput aus. Treten dabei Fehler auf, werden diese im Stream stderr ausgegeben. Historisch gesehen war dabei stdin meist die Tastatur und stdout sowie stderr der Bildschirm. Um dieses System flexibler zu gestalten, sind diese Streams Filedeskriptoren zugeordnet. Da unter Linux praktisch alles ein File ist, können diese Streams flexibel genutzt werden. Das alles hört sich sehr kompliziert an, ist aber im Endeffekt sehr einfach und dazu noch überaus nützlich. Wir wollen uns dazu einige Beispiele ansehen.

Anwendung und Syntax:

Wir können den Befehl ls nutzen um Informationen auf stdout und stderr auszugeben. Nutzen wir ls auf eine Datei die wirklich existiert, erscheinen Informationen über die Datei auf dem stdout-Stream. Nutzen wir ls dagegen auf eine nicht existente Datei, erhalten wir eine Fehlermeldung im Stream stderr. Da beide Streams standardmäßig auf dem selben Gerät ausgeben, können wir zunächst keinen Unterschied feststellen. Gehen wir von einem Standardlinuxsystem aus, in dem das Verzeichnis /home existiert, während das Verzeichnis /hom nicht existent ist.

 ls /home

Dieser Befehl liefert den Inhalt des Verzeichnisses /home auf stdout.

 ls /hom

Dieser Befehl liefert eine Fehlermeldung auf stderr, in etwa wie ls: cannot access '/hom': No such file or directory

Nehmen wir an, wir möchten nun die Ausgabe von ls /home in eine Datei umleiten. Dazu können wir den Stream stdout (Filedeskriptor 1) nutzen und diesen statt auf dem Bildschirm ausgeben zu lassen, in eine Datei umleiten.

 ls /home 1>output.txt

oder verkürzt

 ls /home > output.txt

Die Datei output.txt enthält nun die Ausgabe des Befehls /ls home. Der Befehl ls macht es möglich, die Inhalte von mehreren Verzeichnissen gleichzeitig darzustellen:

 ls /home /hom 1>output.txt 2>error.txt

Hier wird nun der Output des Streams stdout in die Datei output.txt umgeleitet, während der Output des Streams stderr in die Datei error.txt umgeleitet wird. Damit lassen sich z.B. sehr einfach die Fehlermeldungen in ein Log schreiben.

Ebenso kann auch der stdin eines Programmes umgeleitet werden. Nehmen wir an dass wir eine Textdatei namens directory.txt mit folgendem Inhalt haben:

 /home

Wir können diese Datei dann als Standardinput für andere Kommandos wie z.B. cat nutzen.

 cat < directory.txt

Dies scheint zuerst einmal wenig nützlich, da der Befehl

 cat directory.txt

den gleichen Zweck erfüllen würde. Wenn man aber bedenkt dass die Datei directory.txt nicht nur den Namen eines Verzeichnisses sondern den Namen vieler Verzeichnisse enthalten kann, die immer wieder als stdin für Kommandos dienen können, kann man sich die Nützlichkeit von stdin-Redirektion besser vorstellen. Dafür werden allerdings meist Schleifen benötigt.

Weitere Beispiele

Will man stdin und stderr in das gleiche File umleiten, so wird folgendes Konstrukt gebraucht:

 ls input > output 2>&1

Man kann auch mehrere Redirectoperatoren hintereinander schalten

 sort < input.txt 1>output.txt 2>error.txt > sort > sorted-error.txt

Dieser Befehl sortiert die Datei input.txt, splittet stdout und stderr in zwei Datein auf, sortiert die Datei error.txt und speichert dein output in die Datei sorted-error.txt.

Übungen:

    1. Gib den Inhalt der Datei linux.txt im Verzeichnis subdir aus und leite die Ausgabe in eine Datei names torvalds.txt im aktuellen Verzeichnis um.
       cat < subdir/linux.txt > torvalds.txt
    2. Gib den Inahlt des Unterzeichnisses subdir aus und leite den Inhalt in eine Datei names listing.txt weiter.
       ls subdir > listing.txt
    3. Leite die Ausgabe von stderr des Befehles ls subdir2 in die Datei error.txt um.
      ls subdir2 2>error.txt

Zusammenfassung:

Die Umleitung von Streams an andere Programme bzw. Outputdevices ist ein sehr mächtiges Werkzeug um sich die Arbeit zu erleichtern. Die Umleitung von Streams wird später auch vor allem im Zusammenhang mit Bashskripten wichtig und wertvoll. Da das Konzept von Unix bzw. Linux darauf basiert, dass alle Programme einen möglichst uniformen Input und Output haben, lassen sich mit Command Line Redirection äußert mächtige Befehlsketten bilden.