Ein-/Ausgabeumleitung
Text, Pipes & Filter
Die drei Standardkanäle
Jedes Linux-Programm kennt drei Datenkanäle („Streams“): stdin (Standardeingabe, Kanal 0), stdout (Standardausgabe, Kanal 1) und stderr (Fehlerausgabe, Kanal 2). Normalerweise kommt stdin von der Tastatur, stdout und stderr gehen auf den Bildschirm. Mit Umleitung kannst du diese Kanäle auf Dateien oder andere Programme lenken.
Ausgabe in Dateien lenken
$ echo "Hallo" > datei.txt # stdout in Datei (überschreibt!) $ echo "Welt" >> datei.txt # stdout anhängen $ ls -l > liste.txt # Ergebnis speichern
Wichtiger Unterschied: > überschreibt die Zieldatei komplett, >> hängt nur an. Eine versehentliche Verwechslung kann Daten löschen!
Eingabe aus Datei
Mit < liest ein Programm seine Eingabe aus einer Datei statt von der Tastatur:
$ sort < namen.txt $ wc -l < datei.txt
Fehler umleiten
Fehlermeldungen laufen über stderr (Kanal 2). Sie werden getrennt von der normalen Ausgabe umgeleitet:
$ befehl 2> fehler.log # nur Fehler in Datei $ befehl > out.txt 2> err.txt # getrennt speichern $ befehl > alles.txt 2>&1 # Fehler MIT in stdout leiten
Die Schreibweise 2>&1 bedeutet: „leite Kanal 2 dorthin, wohin Kanal 1 geht“. Die Reihenfolge ist entscheidend – > datei 2>&1 ist korrekt, denn zuerst wird stdout auf die Datei gesetzt, dann stderr darauf gespiegelt.
/dev/null – der Mülleimer
Das Spezialgerät /dev/null verschluckt alles, was hineingeschrieben wird. Damit unterdrückst du unerwünschte Ausgaben:
$ befehl 2> /dev/null # Fehler verwerfen $ befehl > /dev/null 2>&1 # alles verwerfen (komplett still)
| Operator | Wirkung |
|---|---|
> | stdout in Datei (überschreiben) |
>> | stdout anhängen |
< | stdin aus Datei |
2> | stderr in Datei |
2>&1 | stderr nach stdout |
Welcher Operator hängt Ausgabe an eine Datei an, ohne sie zu überschreiben?
Stolperfallen & Sicherheit
Die größte Gefahr ist das versehentliche Überschreiben mit >. Manche Shells bieten die Option set -o noclobber, die ein Überschreiben bestehender Dateien verhindert. Umleitungen lassen sich hervorragend mit Pipes kombinieren, um ganze Verarbeitungsketten zu bauen.