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.

Zurück zur Uebersicht