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

tee datei – schreibt in eine Datei und überschreibt deren bisherigen Inhalt. Typisch für eine neue oder bewusst neu erzeugte Ausgabe.

tee -a datei – hängt die Ausgabe am Ende einer Datei an. Typisch für fortlaufende Protokolle.

tee datei1 datei2 – schreibt denselben Datenstrom in mehrere Dateien und zeigt ihn weiterhin im Terminal.

sudo tee datei – führt den Schreibvorgang mit erhöhten Rechten aus; ohne -a wird überschrieben.

sudo tee -a datei – hängt mit erhöhten Rechten an eine geschützte Datei an.

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.log oder protokoll-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
  • ls erzeugt stdout.
  • Die Pipe übergibt stdout an stdin von tee.
  • tee zeigt die Daten und schreibt sie in output.txt.
  • Eine vorhandene Datei wird ohne -a ersetzt.

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

  • tee liest von stdin und schreibt gleichzeitig nach stdout sowie in Dateien.
  • befehl | tee datei zeigt stdout an und überschreibt die Datei.
  • -a beziehungsweise --append hängt an, statt zu überschreiben.
  • Mehrere Dateinamen bewirken paralleles Schreiben desselben Datenstroms.
  • Eine Pipe überträgt zunächst nur stdout; 2>&1 nimmt stderr hinzu.
  • Für geschützte Zieldateien muss sudo vor tee stehen.
  • tee verändert den Datenstrom nicht inhaltlich, sondern dupliziert ihn.

Eine verwandte Einführung zur Weitergabe von Programmausgaben findest du unter Die Ausgabe eines Programms teilen.