Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

adminstoriesausgabeumlenkung [20120813 12:58] (aktuell)
Dirk Deimeke angelegt
Zeile 1: Zeile 1:
 +====== 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:
 +
 +<code bash>#​!/​bin/​bash
 +echo "​stdout,​ Variante 1" > /dev/stdout
 +echo "​stdout,​ Variante 2" >&1
 +echo "​stderr,​ Variante 1" > /dev/stderr
 +echo "​stderr,​ Variante 2" >&​2</​code>​
 +
 +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''​.
 +
 +<​code>​dirk@drusus ~ $ ./out.bash
 +stdout, Variante 1
 +stdout, Variante 2
 +stderr, Variante 1
 +stderr, Variante 2</​code>​
 +
 +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:
 +
 +<​code>​dirk@drusus ~ $ ./out.bash 1>/​dev/​null
 +stderr, Variante 1
 +stderr, Variante 2</​code>​
 +
 +Mit dem Fehlerkanal geht das natuerlich auch:
 +
 +<​code>​dirk@drusus ~ $ ./out.bash 2>/​dev/​null
 +stdout, Variante 1
 +stdout, Variante 2</​code>​
 +
 +Ab hier lenken wir beide Kanaele um, beide Formen sind gleichbedeutend:​
 +
 +<​code>​dirk@drusus ~ $ ./out.bash 1>/​dev/​null 2>/​dev/​null
 +dirk@drusus ~ $ ./out.bash &>/​dev/​null</​code>​
 +
 +Wir wollen die Fehlerausgabe auf das gleiche Ziel umlenken wie die Standardausgabe.
 +
 +<​code>​dirk@drusus ~ $ ./out.bash 1>/​dev/​null 2>&​1</​code>​
 +
 +Aber Achtung, das Folgende, was ich gerne mal falsch mache, funktioniert nicht:
 +
 +<​code>​dirk@drusus ~ $ ./out.bash 2>&1 1>/​dev/​null
 +stderr, Variante 1
 +stderr, Variante 2</​code>​
 +
 +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]]