VMware ESXi and vSphere Cluster Management
Linux: Programmausgabe mit tee gleichzeitig anzeigen und speichern
Lerne, wie Linux tee Ausgaben im Terminal anzeigt und gleichzeitig in Dateien schreibt – mit Pipes, Anhängen, stderr, sudo und mehreren Zieldateien.
Der Linux-Befehl tee dupliziert einen Datenstrom: Er liest Daten aus der Standardeingabe (stdin), gibt sie weiterhin über die Standardausgabe (stdout) aus und schreibt sie gleichzeitig in eine oder mehrere Dateien. So bleibt eine Programmausgabe während der Ausführung im Terminal sichtbar und wird zusätzlich protokolliert.
Was macht tee?
Die Standardeingabe ist der Eingabekanal eines Programms. Die Standardausgabe ist der normale Ausgabekanal, der im Terminal erscheint. tee nimmt Daten von stdin entgegen und verteilt denselben Inhalt auf stdout sowie auf angegebene Dateien.
Der Datenstrom wird dabei nicht inhaltlich verändert. tee kopiert ihn lediglich an mehrere Ziele. Das ist beispielsweise hilfreich, wenn ein längerer Befehl beobachtet und seine Ausgabe später ausgewertet werden soll.
ls | tee output.txt
In diesem Beispiel erzeugt ls seine Standardausgabe. Die Pipe | verbindet diese Ausgabe mit der Standardeingabe von tee. Die Ausgabe erscheint im Terminal und wird in output.txt gespeichert.
tee in einer Pipeline
Eine Pipe ist der Shell-Operator |. Sie verbindet die Standardausgabe eines Befehls mit der Standardeingabe des nächsten Befehls. Die allgemeine Form lautet:
befehl | tee datei
Nach tee kann die Pipeline fortgesetzt werden. Dadurch lässt sich eine vollständige Ausgabe speichern, während eine weiterverarbeitende Pipeline nur einen Teil davon erhält:
befehl | tee vollstaendig.log | grep suchmuster
tee schreibt hier den vollständigen Datenstrom in vollstaendig.log. Gleichzeitig gibt es ihn an grep weiter. Im Terminal erscheinen dadurch nur Zeilen, die dem Suchmuster entsprechen.
Standardmäßig wird die Zieldatei überschrieben
Wird eine vorhandene Datei ohne Option an tee übergeben, ersetzt tee ihren bisherigen Inhalt. Dieser Vorgang heißt Überschreiben. Frühere Protokolle können dadurch verloren gehen.
ls | tee output.txt
Prüfe bei wichtigen Daten den Dateinamen, den Pfad und gegebenenfalls den bisherigen Inhalt, bevor du diesen Befehl ausführst. Mit pwd lässt sich das aktuelle Arbeitsverzeichnis prüfen. Für wichtige Protokolle kann außerdem eine Sicherung sinnvoll sein.
Ausgaben an eine Datei anhängen
Mit -a oder der ausgeschriebenen Form --append ergänzt tee neue Daten am Ende einer vorhandenen Datei. Der alte Inhalt bleibt erhalten.
datum_oder_befehl | tee -a protokoll.txt
Das eignet sich für fortlaufende Protokolle: Jede weitere Befehlsausgabe wird an protokoll.txt angehängt und bleibt zugleich im Terminal sichtbar.
Der Unterschied ist wichtig: tee datei beginnt mit einer neuen Datei beziehungsweise ersetzt den Inhalt, während tee -a datei am Dateiende weiterschreibt.
Eine Ausgabe in mehrere Dateien schreiben
tee akzeptiert mehrere Dateinamen. Jede angegebene Datei erhält denselben Datenstrom, und die Ausgabe erscheint weiterhin auf stdout.
befehl | tee ausgabe-a.txt ausgabe-b.txt
Nach dem Befehl enthalten ausgabe-a.txt und ausgabe-b.txt denselben Inhalt. Auch hier gilt: Ohne -a werden vorhandene Zieldateien überschrieben. Soll an mehrere Dateien angehängt werden, steht die Option vor den Dateinamen:
befehl | tee -a ausgabe-a.txt ausgabe-b.txt
Wichtige tee-Optionen und Verhaltensweisen
Standardausgabe und Standardfehler
Linux-Programme verwenden normalerweise mindestens zwei getrennte Ausgabekanäle:
- stdout bezeichnet die normale Standardausgabe.
- stderr bezeichnet den Standardfehlerkanal für Fehlermeldungen und Diagnoseausgaben.
Eine gewöhnliche Pipe leitet nur stdout weiter. Deshalb erhält tee bei dieser Form nicht automatisch die Fehlermeldungen:
befehl | tee ausgabe.log
Mit 2>&1 wird stderr in denselben Datenstrom wie stdout geleitet. Danach kann tee beide Kanäle gemeinsam anzeigen und speichern:
befehl 2>&1 | tee ausfuehrung.log
Das ist sinnvoll, wenn ein vollständiger Ablauf einschließlich Warnungen und Fehlern dokumentiert werden soll. Eine getrennte Behandlung ist besser, wenn normale Ergebnisse und Fehlermeldungen unabhängig voneinander gespeichert oder ausgewertet werden sollen. So bleiben beispielsweise Erfolgsdaten und Diagnoseinformationen getrennt.
In geschützte Dateien schreiben
Ein häufiger Irrtum betrifft sudo. Wenn sudo nur vor dem erzeugenden Befehl steht, erhält tee dadurch nicht automatisch erhöhte Rechte:
sudo befehl | tee /geschuetzter/pfad/datei
Der erste Prozess läuft zwar mit erhöhten Rechten, aber die Shell startet tee normalerweise mit den Rechten des aktuellen Benutzers. Da tee die Zieldatei öffnet, muss sudo vor tee stehen:
printf '%s\n' 'Wert' | sudo tee /etc/beispiel.conf
Hier schreibt tee selbst mit erhöhten Rechten in die geschützte Datei. Ohne -a ersetzt der Befehl den bisherigen Inhalt.
Zum Ergänzen einer Zeile wird -a mit sudo tee kombiniert:
printf '%s\n' 'Inhalt' | sudo tee -a /etc/beispiel.conf
Sichere und nachvollziehbare Nutzung
- Verwende aussagekräftige Dateinamen wie
ausfuehrung.logoderprotokoll-2026-08-18.log. - Nutze absolute Pfade, wenn der Speicherort eindeutig sein muss. Relative Pfade beziehen sich auf das aktuelle Arbeitsverzeichnis.
- Prüfe bei wichtigen Dateien, ob du überschreiben oder anhängen möchtest.
- Speichere sensible Ausgaben nicht ungeschützt. Passwörter, Zugriffstoken und personenbezogene Daten können im Terminal sichtbar werden und in Logdateien landen.
- Filtere oder begrenze die Ausgabe, wenn nicht alle Daten protokolliert werden müssen.
Ein Zeitstempel kann die spätere Zuordnung von Protokollen erleichtern. Wichtig ist außerdem, die Berechtigungen der erzeugten Datei zu prüfen, wenn die Ausgabe vertrauliche Informationen enthalten könnte.
Praktische Beispiele
Verzeichnisinhalt anzeigen und speichern
ls | tee output.txt
lserzeugt stdout.- Die Pipe übergibt stdout an stdin von
tee. teezeigt die Daten und schreibt sie inoutput.txt.- Eine vorhandene Datei wird ohne
-aersetzt.
Eine bestehende Logdatei fortsetzen
datum_oder_befehl | tee -a protokoll.txt
Die Option -a bewahrt alte Logeinträge. Die neue Ausgabe wird am Ende ergänzt und bleibt im Terminal sichtbar.
Mehrere Ziele verwenden
befehl | tee ausgabe-a.txt ausgabe-b.txt
Beide Dateien erhalten dieselbe Ausgabe. Zusätzlich wird der Datenstrom auf stdout ausgegeben.
Normale Ausgabe und Fehler gemeinsam protokollieren
befehl 2>&1 | tee ausfuehrung.log
Die Umleitung führt stderr und stdout zusammen. tee erhält anschließend beide Arten von Meldungen.
Eine geschützte Systemdatei ergänzen
printf '%s\n' 'Inhalt' | sudo tee -a /etc/beispiel.conf
Durch sudo vor tee kann der Prozess die geschützte Datei öffnen. Die Option -a verhindert, dass vorhandene Einträge beim Ergänzen ersetzt werden.
Fehlerbehebung
Frühere Dateiinhalte fehlen
Wenn die Zieldatei nur die neue Ausgabe enthält, wurde wahrscheinlich tee ohne -a verwendet. Für zusätzliche Einträge lautet die passende Form:
befehl | tee -a datei.log
Bei wichtigen Daten sollte vor dem Überschreiben eine Sicherung erstellt werden.
Fehlermeldungen fehlen in der Logdatei
Dann wurde vermutlich nur stdout durch die Pipe geleitet. Verwende für beide Kanäle:
befehl 2>&1 | tee datei.log
Permission denied trotz sudo
Steht sudo nur vor dem ersten Befehl, versucht tee weiterhin ohne erhöhte Rechte zu schreiben. Setze sudo vor tee:
printf '%s\n' 'Wert' | sudo tee /etc/datei
Datei am falschen Ort
Bei einem relativen Pfad hängt der Speicherort vom aktuellen Arbeitsverzeichnis ab. Prüfe es mit:
pwd
Verwende anschließend entweder den korrekten relativen Pfad oder einen absoluten Zielpfad.
Sensible Daten wurden gespeichert
Eine unselektierte Programmausgabe kann vertrauliche Werte enthalten. Speichere nur notwendige Informationen, filtere sensible Zeilen und prüfe die Dateiberechtigungen.
Prüfungsrelevante Merksätze
teeliest von stdin und schreibt gleichzeitig nach stdout sowie in Dateien.befehl | tee dateizeigt stdout an und überschreibt die Datei.-abeziehungsweise--appendhängt an, statt zu überschreiben.- Mehrere Dateinamen bewirken paralleles Schreiben desselben Datenstroms.
- Eine Pipe überträgt zunächst nur stdout;
2>&1nimmt stderr hinzu. - Für geschützte Zieldateien muss
sudovorteestehen. teeverändert den Datenstrom nicht inhaltlich, sondern dupliziert ihn.
Eine verwandte Einführung zur Weitergabe von Programmausgaben findest du unter Die Ausgabe eines Programms teilen.