====== Ausgabeumlenkung ======
* Urspruenglicher Autor: Dirk Deimeke
* Urspruengliches Datum: 01.04.2011
Als Administrator hat man relativ haeufig mit Ausgabeumlenkung zu tun.
Im "Normalfall" (man kann auch mehr definieren) gibt es genau zwei Ausgabekanaele, Standard Out (Kanal 1, stdout) und Standard Error (Kanal 2, stderr). Wenn diese nicht umgelenkt sind, gehen beide Ausgabestroeme an die Konsole bzw. den Bildschirm.
Dieses Verhalten kann man durch Umlenkung beeinflussen.
''programm >logdatei'' ist die Kurzform von ''programm 1>logdatei'' und lenkt stdout (Kanal 1) in eine Logdatei um. stderr ist davon nicht betroffen. Viele merken dass das erste Mal, wenn sie die Ausgabe filtern wollen. Filter nehmen die Standard Ausgabe eines Befehls als Standard Eingabe (stdin, Kanal 0) und wenden darauf ihre Modifikationen an. ''grep'' ist beispielsweise ein Filter, ''programm | grep'' nimmt, wie beschrieben, nur den Standard Ausgabekanal von ''programm''. Moechte man sowohl den Standard-Ausgabe-Kanal wie auch Standard-Fehler-Kanal filtern, muss man stderr auf stdout "umbiegen". Das geht mit ''2>&1'', stdout (2) wird auf stdin (1) umgeleitet.
Um das Verhalten der Ausgabeumlenkung zu illustrieren, schreibe ich ein Skript namens ''out.bash'' mit folgendem Inhalt:
#!/bin/bash
echo "stdout, Variante 1" > /dev/stdout
echo "stdout, Variante 2" >&1
echo "stderr, Variante 1" > /dev/stderr
echo "stderr, Variante 2" >&2
Die beiden Varianten sind jeweils gleichbedeutend, je eine Ausgabe erfolgt auf "Standard Out" und auf "Standard Error". ACHTUNG: Zwischen dem Groesser-Zeichen >, dem Kaufmanns-Und & und der Kanal-Nummer darf kein Leerzeichen sein.
Im folgenden zeige ich die verschiedenen Anwendungsmoeglichkeiten der Ausgabeumlenkung. Statt in eine Datei oder nach ''/dev/null'' koennen die Kanaele auch beispielsweise an einen Drucker weitergeleitet werden.
Normale Ausgabe von ''stdout'' und ''stderr''.
dirk@drusus ~ $ ./out.bash
stdout, Variante 1
stdout, Variante 2
stderr, Variante 1
stderr, Variante 2
Jetzt lenken wir die Standard Ausgabe nach ''/dev/null'' um (die "1" kann auch weggelassen werden), hier darf zwischen der Kanalnummer und dem Groesser-Zeichen > kein Leerzeichen sein:
dirk@drusus ~ $ ./out.bash 1>/dev/null
stderr, Variante 1
stderr, Variante 2
Mit dem Fehlerkanal geht das natuerlich auch:
dirk@drusus ~ $ ./out.bash 2>/dev/null
stdout, Variante 1
stdout, Variante 2
Ab hier lenken wir beide Kanaele um, beide Formen sind gleichbedeutend:
dirk@drusus ~ $ ./out.bash 1>/dev/null 2>/dev/null
dirk@drusus ~ $ ./out.bash &>/dev/null
Wir wollen die Fehlerausgabe auf das gleiche Ziel umlenken wie die Standardausgabe.
dirk@drusus ~ $ ./out.bash 1>/dev/null 2>&1
Aber Achtung, das Folgende, was ich gerne mal falsch mache, funktioniert nicht:
dirk@drusus ~ $ ./out.bash 2>&1 1>/dev/null
stderr, Variante 1
stderr, Variante 2
Shell-Befehle werden von links nach rechts aufgeloest. Zuerst wird die Fehlerausgabe auf den Standardausgabekanal umgelenkt. Zu dem Zeitpunkt ist das noch die Konsole (oder der Bildschirm), erst danach wird die Standardausgabe umgelenkt.
[[adminstoriesartikel|Zurück zur Uebersicht]]