Anleitung: Ein- und Ausgabeumleitung in Bash (`>`, `>>`, `2>&1`)
December 15, 2015
Ein- und Ausgabeumleitung (I/O Redirection) ist ein Kernkonzept der Unix-Shell, das es ermöglicht, die Standard-Datenströme von Befehlen zu manipulieren. Standardmäßig lesen Befehle von der Standardeingabe (stdin) und schreiben ihre Ausgabe an die Standardausgabe (stdout) und Fehler an die Standardfehlerausgabe (stderr).
Diese Anleitung zeigt, wie man diese Ströme in Dateien umleitet.
Die drei Standard-Datenströme
| Deskriptor | Name | Beschreibung |
|---|---|---|
0 | stdin | Standardeingabe (typischerweise die Tastatur). |
1 | stdout | Standardausgabe (typischerweise das Terminal). |
2 | stderr | Standardfehlerausgabe (typischerweise das Terminal). |
1. Umleiten der Standardausgabe (stdout)
> (Überschreiben)
Der >-Operator leitet stdout in eine Datei um. Wenn die Datei bereits existiert, wird ihr Inhalt überschrieben.
# Schreibt "Hallo Welt" in die Datei 'gruss.txt'
echo "Hallo Welt" > gruss.txt
# Schreibt die Liste der Dateien im /etc-Verzeichnis in 'liste.txt'
ls /etc > liste.txt
>> (Anhängen)
Der >>-Operator hängt stdout an das Ende einer Datei an, ohne den bestehenden Inhalt zu löschen.
# Fügt eine weitere Zeile zur Log-Datei hinzu
echo "$(date): Server neugestartet." >> server.log
2. Umleiten der Standardfehlerausgabe (stderr)
Fehlermeldungen werden nach stderr geschrieben. Um sie umzuleiten, muss explizit der File Descriptor 2 angegeben werden.
# Versucht, auf eine nicht existierende Datei zuzugreifen
# Die Fehlermeldung wird in 'error.log' geschrieben
ls /pfad/nicht/existent 2> error.log
2>>: Hängtstderran eine Datei an.
3. Kombinierte Umleitung von stdout und stderr
In dieselbe Datei (POSIX-konform)
# Führt das Skript aus und leitet stdout nach 'output.log'
# und leitet dann stderr (2) dorthin, wo stdout hinzeigt (>&1)
./mein_skript.sh > output.log 2>&1
Die Reihenfolge ist entscheidend. 2>&1 muss nach der Umleitung für stdout stehen.
In dieselbe Datei (Bash-Kurzform)
In Bash (ab Version 4) kann der &>-Operator verwendet werden.
# Überschreibt die Datei mit beiden Ausgabeströmen
./mein_skript.sh &> output.log
# Hängt an die Datei an
./mein_skript.sh &>> output.log
4. Überschreiben von Dateien verhindern (noclobber)
Um das versehentliche Überschreiben von Dateien mit > zu verhindern, können Sie die noclobber-Option in Ihrer Shell aktivieren.
set -o noclobber
Wenn diese Option aktiv ist, schlägt eine >-Umleitung fehl, wenn die Zieldatei bereits existiert.
echo "test" > existierende_datei.txt
# bash: existierende_datei.txt: cannot overwrite existing file
Um das Überschreiben in diesem Modus zu erzwingen, verwenden Sie den >|-Operator.
echo "test" >| existierende_datei.txt
Fazit
Die Beherrschung der I/O-Umleitung ist fundamental für das Schreiben von Skripten und die effektive Arbeit auf der Kommandozeile. Sie ermöglicht die Erstellung von Log-Dateien, die Trennung von erfolgreichen Ausgaben und Fehlermeldungen und die Verkettung von Befehlen auf mächtige Weise.