$ program [arguments...] 2>&1 | tee outfile
2>&1
Dumps der Streams stderr und stdout.
tee outfile
nimmt den Stream, den es bekommt und schreibt ihn auf den Bildschirm und in die Datei "outfile".
Dies ist wahrscheinlich das, wonach die meisten Menschen suchen. Die wahrscheinliche Situation ist, dass ein Programm oder Skript lange Zeit hart arbeitet und viel Ausgabe produziert. Der Benutzer möchte es regelmäßig auf Fortschritt überprüfen, möchte aber auch, dass die Ausgabe in eine Datei geschrieben wird.
Das Problem (insbesondere beim Mischen von stdout- und stderr-Streams) besteht darin, dass die Streams vom Programm geleert werden. Wenn zum Beispiel alle Schreibvorgänge auf stdout sind nicht gespült, aber alle die Schreibvorgänge auf stderr sind , werden sie in der Ausgabedatei und auf dem Bildschirm in chronologischer Reihenfolge angezeigt.
Es ist auch schlecht, wenn das Programm nur alle paar Minuten 1 oder 2 Zeilen ausgibt, um den Fortschritt zu melden. In einem solchen Fall würde der Benutzer, wenn die Ausgabe nicht vom Programm geleert würde, stundenlang keine Ausgabe auf dem Bildschirm sehen, da nichts davon stundenlang durch das Rohr geschoben würde.
Update: Das Programm unbuffer
, Teil des expect
Pakets, löst das Pufferproblem. Dies führt dazu, dass stdout und stderr sofort auf den Bildschirm und die Datei schreiben und diese synchron halten, wenn sie kombiniert und umgeleitet werden tee
. Z.B:
$ unbuffer program [arguments...] 2>&1 | tee outfile