UnixTools01 11
Redirection - part 2
Umlenken von stderr
Es ist Konvention, dass Programme ihre gewöhnlicheAusgabe auf den Ausgabekanal stdout schrieben und Fehlernachrichten auf einen anderen Kanal, namens stderr.
Normalerweise sind beide Kanäle mit dem Bilschrim verbunden, d.h. egal ob das >Programm eine normale Ausgabe über stdout ausgibt, oder eine Fehlernachricht über stsderr, sie erscheinen beide auf dem Bildschirm.
Weiter haben wir gesehen, dass man mit > datei den Ausgabekanal stdout in eine Datei umlenken kann
$ ls -la /bin > /tmp/files.txt
Im obigen Beispiel würde das kommando ls' seine Ausgabe (die Liste von Dateien) in die Datei /tmp/files.txt schreiben. Sollten dabei Fehler auftreten, würden diese aber weiterhin auf dem Bildschrim erscheinen, weil stderr noch nicht umgelenkt wurde.
$ ls -lisa 2> /tmp/errors.txt
Mit 2> datei kann man nun den Ausgabekanal stderr in eine Datei umlenken. Im Obigen Beispiel würden also die normalen Ausgaben auf dem Bildschirm erscheinen (weil stdout nicht umgelenkt wurde), alle Fehlernachrichten würden dagegen in die Datei /tmp/errors.txt geschrieben (umgelenkt) werden.
$ ls -lisas > /tmp/files.txt 2> /tmp/errors.txt
Es ist auch möglich, stdout in eine Datei und stderr in eine ander Datei umzulenken.
2>&1
Normalerweise ist es eine gute Sache, für die normalen Ausgaben (stdout) und Fehlernachrichten (stderr) getrennt entscheiden zu können, ob und wohin sie umgelenkt werden. Manchmal mchte man sie einfach zu einem Kanal zusammenfassen. Mit 2>&1 legen wir fest, dass stderr (ebenfalls) dorthin umgelenkt wird, wohin gerade stdout umgelenkt ist.
<< END
Dieses Konstrukt sehen wir häufig in Shell-Skripten. Das sind Dateien, in denen mehrere Shell-Kommandos stehen, die die Shell hintereinander (im batch-Modus) abarbeiten kann (mehr dazu später.
Mchten Sie einem Programm eine (meist kleine) Zahl von Eingabezeilen übergeben, und diese direkt inscheiben, so können Sie das so tun:
$ cat << END Hello World How are you? END
In diesem fall wird der Eingabekanal stdin umgelenkt, aber nicht aus einer Datei, sondern stattdessen steht die Eingabe direkt hinter dem Kommando. Bis wann? D.h. wann ist die Eingabe für das Programm beendet? Dazu geben Sie in der Kommandozeile hinter dem << ein Wort Ihrer Wahl an, hier haben wir END gewählt. Sobald die EIngabe eine Zeile enthält, die genau dieses WOrt enthält (und nichts weiter), ist die Eingabe damit beendet. Die Ende-Matkierung (hier END) slebst gehrt scho nnicht mehr zu der Eingabe, die dem Programm übergeben wird.
$echo Hello World > file1.txt
Schreibt Hello World in die Datei file1.txt
$ cat > file2.txt << END Hello World END
Schriebt eine Zeile, nämlich Hello World in die Datei file2.txt'. Das Ergebnis ist also dasselbe, wie bei dem Programm 'echo zuvor.
$ cat > file3.txt << END Hello World! How are you? I am fine END
Schreibt 3 Zeilen in die Datei file3.txt. Wie man sieht, ist diese Art der Umlenkung geeignet, wenn die EIngabe direkt angegeben werden soll und aus mehreren Zeilen besteht.