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.