Wenn du die Ausgabe eines Befehls in eine Datei oder an einen anderen Befehl weitergeben möchtest, kann es sein, dass Fehlermeldungen trotzdem auf dem Bildschirm erscheinen.
In der Bash und anderen Shells nutzt ein Programm beim Ausführen drei standardmäßige Ein-/Ausgabe-Ströme. Diese Ströme werden durch numerische Dateideskriptoren dargestellt:
- `0` - `stdin`, der Standard-Eingabestrom.
- `1` - `stdout`, der Standard-Ausgabestrom.
- `2` - `stderr`, der Standard-Fehlerstrom.
Ein Dateideskriptor ist einfach eine Zahl, die eine geöffnete Datei repräsentiert.
Der Eingabestrom liefert dem Programm Informationen, normalerweise durch Tastatureingaben.
Die Programmausgabe gelangt in den Standardausgabestrom, während Fehlermeldungen im Standardfehlerstrom landen. Standardmäßig werden sowohl die Ausgabe- als auch die Fehlerströme auf dem Bildschirm angezeigt.
Ausgabeumleitung
Die Umleitung ermöglicht es, die Ausgabe eines Programms abzufangen und an ein anderes Programm oder eine Datei weiterzugeben.
Ströme können mit dem Operator n umgeleitet werden, wobei n die Nummer des Dateideskriptors darstellt.
Wird n weggelassen, wird standardmäßig der Dateideskriptor 1 (Standardausgabe) verwendet. Die beiden folgenden Befehle sind beispielsweise identisch und leiten die Ausgabe (stdout) in eine Datei:
Befehl > Datei
Befehl 1 > Datei
Um den Standardfehler (stderr) umzuleiten, nutze den Operator 2:
Befehl 2 > Datei
Du kannst sowohl stderr als auch stdout in zwei unterschiedliche Dateien schreiben lassen:
Befehl 2> Fehler.txt 1> Ausgabe.txt
Um Fehlermeldungen auf dem Bildschirm zu unterdrücken, leite stderr nach /dev/null um:
Befehl 2> /dev/null
Umleitung von stderr zu stdout
Beim Speichern der Programmausgabe in einer Datei ist es üblich, stderr auf stdout umzuleiten, um alles in einer Datei zu erfassen.
Um stderr auf stdout umzuleiten und Fehlermeldungen in dieselbe Datei wie die Standardausgabe zu übertragen, verwende folgende Schreibweise:
Befehl > Datei 2>&1
Hierbei leitet >Datei die stdout in die Datei um, und 2>&1 leitet den stderr-Strom an den aktuellen Ort von stdout.
Die Reihenfolge der Umleitung ist entscheidend. Im folgenden Beispiel wird beispielsweise nur stdout in die Datei umgeleitet. Das liegt daran, dass stderr auf stdout umgeleitet wird, bevor stdout zur Datei umgeleitet wurde:
Befehl 2>&1 > Datei
Eine alternative Methode, um stderr auf stdout umzuleiten, ist die Verwendung der >&-Struktur. In der Bash entspricht >& der Bedeutung von 2>&1:
Befehl >& Datei
Fazit
Das Verständnis des Konzepts der Umleitungen und Dateideskriptoren ist wichtig für die Arbeit mit der Kommandozeile.
Verwende die 2>&1 oder >&-Strukturen, um sowohl stderr als auch stdout umzuleiten.