| Home Profil Fun |
#57 Linux 05.04.2009
stdin, stdout und stderr umleitenHier finden sich einige Beispiele um die Standard-Streams stdin, stdout und stderr in der Bash beliebig umzuleiten. Außerdem gibt es Beispiele zur Interprozesskommunikation mit pipes, named pipes und Dateideskriptoren. STDOUT Nach stdout schreiben. echo "text" stdout in eine Datei umlenken. echo "text" > out.txt stdout ans Ende einer Datei umlenken (anhängen). echo "text" >> out.txt Mit dem tee-Operator kann man stdin nach stdout und gleichzeitig in eine Datei umlenken bzw. kopieren. Dies ist sehr praktisch wenn man den Output auf der Konsole mitverfolgen und gleichzeitig den Output in einer Datei wegsichern möchte. echo "text" | tee out.txt STDERR Nach stderr schreiben. echo "text" >&2 stderr in eine Datei umlenken. xyz 2> err.txt stderr ans Ende einer Datei umlenken (anhängen). xyz 2>> err.txt STDOUT und STDERR stdout und stderr in eine Datei umlenken (Die geschweiften Klammern dienen nur zur Gruppierung der Kommandos).
{ echo "text";xyz; } >result.txt 2>&1
STDIN Von stdin (Tastatur) lesen und in die Variable testvar schreiben. read testvar stdin in eine Datei umlenken. Dies bedeutet, dass ein Kommando das Daten von der Tastatur erwartet sie nun von einer Datei erhält. Als Beispiel weisen wir der Variablen testvar die erste Zeile aus der Datei test.txt zu. read testvar < test.txt PIPES Pipes (|) werden verwendet um stdout und stdin eines anderen Prozesses umzulenken. tail /var/log/messages | grep error Daten in eine Datei umlenken und gleichzeitig auf stdout ausgeben. echo "text" |tee result.txt Die Pipe lenkt stdout in stdin des nächsten Prozesses um. Tee liest von stdin und lenkt gleichzeitig nach stdout und in die Datei result.txt um. stderr statt stdin in eine Pipe schreiben. xyz 2>&1 1>/dev/null | grep bash Um stdout nach stderr und stderr nach stdout umzuleiten wird ein dritter Stream benötigt.
{ echo "text";xyz; } 3>&1 1>&2 2>&3
NAMED PIPES Named Pipes sind eine besondere Form von Pipes. Sie dienen zum Austausch von Daten zwischen Prozessen und sind als Datei im Dateisystem angelegt. Eine Named Pipe erzeugen. mkfifo testpipe Named Pipes können am p erkannt werden: ls -lha prw-r--r-- 1 root root 0 Dec 2 04:09 testpipe Von der Named Pipe lesen. read testvar < testpipe In die Named Pipe schreiben echo "sometext" > testpipe DATEIDESKRIPTOREN Es ist möglich zusätzliche Streams zu erzeugen um auf Dateien zuzugreifen. Diese Streams nennt man Dateideskriptoren. Einen neuen Dateideskriptor zum Lesen von test.txt erzeugen. exec 3< test.txt Einen neuen Dateideskriptor zum Schreiben in test.txt erzeugen. WARNUNG: Bereits das Anlegen des Deskriptors auf diese Art leert die Datei! exec 4> test.txt Einen neuen Dateideskriptor erstellen um Daten an text.txt anzuhängen. exec 5>> test.txt Eine Zeile von test.txt lesen und in der Variable testvar speichern. read testvar <&3 Schreibe eine Zeile in test.txt echo "sometext" >&4Die Erzeugung des Dateideskriptors zum Schreiben hat den Inhalt der Datei bereits gelöscht. Das erste Schreiben in diesen Deskriptor schreibt den Text somit in die erste Zeile. Das zweite Schreiben in die zweite Zeile usw. Text an test.txt anhängen. echo "sometext" >&5 Zuletzt sollte man alle Dateideskriptoren wieder schließen exec 3>&- exec 4>&- exec 5>&- |