stdout, stderr und /dev/null – Die wichtigsten Linux-Datenströme verständlich erklärt
Wer regelmäßig mit Linux arbeitet – egal ob auf Servern, im Terminal oder in Shell-Scripts – stößt früher oder später auf Begriffe wie stdout, stderr, 2>&1 oder /dev/null. Diese Konzepte gehören zu den grundlegenden Bausteinen von Unix-Systemen und sind entscheidend dafür, wie Programme miteinander kommunizieren.

Dieser Artikel erklärt verständlich, wie diese Mechanismen funktionieren und warum sie so wichtig sind.
Die drei Standard-Datenströme unter Linux
Jedes Programm unter Linux besitzt automatisch drei sogenannte Standard-Streams:
| Stream | Nummer | Bedeutung |
|---|---|---|
| stdin | 0 | Standardeingabe |
| stdout | 1 | Standardausgabe |
| stderr | 2 | Fehlerausgabe |
Diese drei Kanäle bilden die Grundlage für die Kommunikation zwischen Programmen.
stdin (Standard Input)
Hierüber erhält ein Programm Daten. Meist kommt diese Eingabe von der Tastatur oder von einem anderen Programm.
stdout (Standard Output)
Hierüber gibt ein Programm seine normale Ausgabe aus. Standardmäßig wird diese im Terminal angezeigt.
stderr (Standard Error)
Fehlermeldungen werden über einen eigenen Kanal ausgegeben, getrennt von der normalen Ausgabe.
Der große Vorteil dieses Konzepts ist, dass sich diese Datenströme flexibel umleiten oder miteinander verbinden lassen.
Ein einfaches Beispiel
Ein klassischer Befehl:
echo "Hallo Welt"
Das Programm echo schreibt den Text auf stdout, und das Terminal zeigt ihn an:
Hallo Welt
Die Ausgabe wird also vom Programm erzeugt und über den Standard-Ausgabekanal an das Terminal geschickt.
Ausgabe in Dateien umleiten
Mit dem >-Operator lässt sich die Standardausgabe in eine Datei umleiten.
ls > dateiliste.txt
Die Dateiliste wird jetzt nicht mehr im Terminal angezeigt, sondern in die Datei dateiliste.txt geschrieben.
Fehler getrennt speichern
Da Fehlermeldungen über stderr laufen, können sie separat umgeleitet werden:
ls /existiert /nichtda 2> fehler.txt
Hier passiert folgendes:
- Die normale Ausgabe geht weiterhin ins Terminal.
- Die Fehlermeldungen landen in der Datei fehler.txt.
stdout und stderr zusammenführen
Oft möchte man sowohl normale Ausgabe als auch Fehler gemeinsam in einer Datei speichern. Dafür gibt es die bekannte Umleitung:
command > output.log 2>&1
Bedeutung:
> output.logleitet stdout in die Datei um2>&1sorgt dafür, dass stderr an denselben Ort geschickt wird
Das Ergebnis: Beide Ausgaben landen im gleichen Logfile.
Ein wichtiger Punkt dabei ist die Reihenfolge.
Die korrekte Variante lautet:
command >file 2>&1
Wenn man die Reihenfolge vertauscht, funktioniert die Umleitung nicht wie erwartet.
Anhängen statt Überschreiben
Mit >> wird eine Datei nicht überschrieben, sondern erweitert:
command >> logfile 2>&1
Neue Ausgaben werden dann am Ende der Datei angehängt.
Diese Form sieht man häufig bei Logfiles.
Das schwarze Loch: /dev/null
Unter Linux existiert eine spezielle Gerätedatei namens:
/dev/null
Alles, was dorthin geschrieben wird, verschwindet einfach.
Man nennt sie deshalb oft scherzhaft ein schwarzes Loch für Daten.
Ausgabe unterdrücken
command > /dev/null
Die normale Ausgabe verschwindet, Fehlermeldungen bleiben sichtbar.
Alles unterdrücken
command > /dev/null 2>&1
Jetzt werden sowohl stdout als auch stderr verworfen.
Diese Technik wird häufig in Scripts oder Cronjobs eingesetzt, wenn man bewusst keine Ausgabe erzeugen möchte.
Programme miteinander verbinden (Pipes)
Ein besonders mächtiges Unix-Konzept sind Pipelines.
Dabei wird die Ausgabe eines Programms direkt zur Eingabe eines anderen Programms weitergeleitet.
ps aux | grep python
Ablauf:
ps auxerzeugt eine Prozessliste über stdout- Die Pipe
|leitet diese Ausgabe weiter grepbekommt die Daten über stdin und filtert sie
So lassen sich komplexe Aufgaben aus vielen kleinen Werkzeugen zusammensetzen.
Moderne Anwendungen: systemd und Docker
Viele moderne Dienste nutzen das stdout/stderr-Prinzip direkt für Logging.
systemd
Services schreiben ihre Logs einfach auf stdout oder stderr.
systemd speichert diese automatisch im Journal.
Logs anzeigen:
journalctl -u servicename
Live-Logs:
journalctl -u servicename -f
Docker
Auch Container folgen diesem Prinzip. Anwendungen schreiben Logs einfach auf stdout.
Abrufen der Logs:
docker logs containername
Live verfolgen:
docker logs -f containername
Deshalb besitzen viele Container gar keine eigenen Logfiles mehr.
Fazit
Das stdout/stderr-Konzept gehört zu den elegantesten Ideen im Unix-Design. Es erlaubt:
- flexible Umleitung von Ausgaben
- getrennte Behandlung von Fehlern
- einfache Verknüpfung von Programmen
- sauberes Logging in modernen Systemen
Wer regelmäßig mit Linux arbeitet, wird diese Mechanismen ständig verwenden – oft sogar ohne es bewusst zu merken.
Gerade in Shell-Scripts und bei der Serveradministration sind sie unverzichtbar.
Wenn man das Prinzip einmal verstanden hat, öffnet sich eine der größten Stärken von Unix-Systemen: kleine Werkzeuge lassen sich beliebig kombinieren.