Home   Profil   Fun
#57 Linux  05.04.2009

stdin, stdout und stderr umleiten


Hier 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" >&4
Die 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>&-