UnixTools01 11

From
Revision as of 13:03, 29 November 2024 by Jpr (talk | contribs) (→‎Pipes)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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.