$ Programm [Argumente...] 2>&1 | tee Ausgabedatei
2>&1
leitet die stderr- und stdout-Streams um. tee Ausgabedatei
nimmt den Stream, den es bekommt, und schreibt ihn auf den Bildschirm und in die Datei "Ausgabedatei".
Dies ist wahrscheinlich wonach die meisten Leute suchen. Die wahrscheinliche Situation ist, dass ein Programm oder Skript lange arbeitet und eine Menge Ausgaben erzeugt. Der Benutzer möchte es regelmäßig auf Fortschritt überprüfen, möchte die Ausgabe aber auch in eine Datei schreiben.
Das Problem (besonders wenn stdout- und stderr-Streams gemischt werden) besteht darin, dass man darauf angewiesen ist, dass die Streams vom Programm gespült werden. Wenn zum Beispiel alle Schreibvorgänge von stdout nicht gespült werden, alle Schreibvorgänge von stderr hingegen gespült werden, dann landen sie in umgekehrter zeitlicher Reihenfolge in der Ausgabedatei und auf dem Bildschirm.
Es ist auch schlecht, wenn das Programm nur alle paar Minuten 1 oder 2 Zeilen zur Fortschrittsanzeige ausgibt. In einem solchen Fall würde der Benutzer bei fehlender Spülung der Ausgabe des Programms über Stunden hinweg überhaupt keine Ausgabe auf dem Bildschirm sehen, da sie nicht durch das Rohr geleitet wird.
Update: Das Programm unbuffer
, Teil des expect
-Pakets, wird das Problem der Zwischenspeicherung lösen. Dadurch werden stdout und stderr sofort auf den Bildschirm und in die Datei geschrieben und halten sie synchron, wenn sie kombiniert und auf tee
umgeleitet werden. z.B.:
$ unbuffer Programm [Argumente...] 2>&1 | tee Ausgabedatei
6 Stimmen
Wenn jemand hier gelandet ist, der nach dem Erfassen von Fehlerausgaben in Datei sucht, schauen Sie sich - unix.stackexchange.com/questions/132511/… an.
9 Stimmen
Eine Anmerkung zur Terminologie: Wenn Sie
foo > output
ausführen, werden die Daten wirklich in stdout geschrieben, und stdout ist die Datei mit dem Namenoutput
. Das bedeutet, dass das Schreiben in die Datei das gleiche ist wie das Schreiben in stdout. Sie fragen, ob es möglich ist, sowohl in stdout als auch in das Terminal zu schreiben.4 Stimmen
@WilliamPursell Ich bin mir nicht sicher, ob Ihre Klarstellung die Dinge verbessert :-) Wie wäre es damit: OP fragt, ob es möglich ist, die Standardausgabe des aufgerufenen Programms sowohl in eine Datei als auch in die Standardausgabe des aufrufenden Programms zu leiten (letzteres wäre die Standardausgabe, die das aufgerufene Programm erben würde, wenn nichts Besonderes getan würde; d.h. das Terminal, wenn das aufrufende Programm eine interaktive Bash-Sitzung ist). Und vielleicht möchten sie auch die Standardfehlerausgabe des aufgerufenen Programms ähnlich leiten ("jede Ausgabe dieses Befehls" könnte vernünftigerweise so interpretiert werden, dass auch stderr eingeschlossen ist).
0 Stimmen
Wenn wir mehrere Befehle haben, deren Ausgaben umgeleitet werden sollen, verwenden Sie
( )
. Zum Beispiel(echo hallo; echo welt) | tee ausgabe.txt