$ program [arguments...] 2>&1 | tee outfile
2>&1
zrzuca strumienie stderr i stdout.
tee outfile
pobiera otrzymany strumień i zapisuje go na ekranie oraz w pliku „outfile”.
Tego prawdopodobnie szuka większość ludzi. Prawdopodobną sytuacją jest to, że jakiś program lub skrypt ciężko pracuje przez długi czas i generuje wiele wyników. Użytkownik chce okresowo sprawdzać postęp, ale chce również, aby dane wyjściowe były zapisywane w pliku.
Problem (szczególnie przy mieszaniu strumieni stdout i stderr) polega na tym, że program polega na opróżnianiu strumieni. Jeśli na przykład wszystkie zapisy na standardowe wyjście nie zostaną usunięte, ale wszystkie zapisy na standardowe zostaną wyczyszczone, to skończy się to chronologicznie w pliku wyjściowym i na ekranie.
Jest to również złe, jeśli program wyświetla tylko 1 lub 2 linie co kilka minut, aby zgłosić postęp. W takim przypadku, jeśli dane wyjściowe nie zostałyby wyczyszczone przez program, użytkownik nawet nie widziałby żadnych danych wyjściowych na ekranie przez wiele godzin, ponieważ żadne z nich nie zostałoby przepchnięte przez rurę przez wiele godzin.
Aktualizacja: program unbuffer
, będący częścią expect
pakietu, rozwiąże problem buforowania. Spowoduje to, że stdout i stderr będą natychmiast zapisywać na ekranie i pliku i utrzymywać je w synchronizacji podczas łączenia i przekierowywania do tee
. Na przykład:
$ unbuffer program [arguments...] 2>&1 | tee outfile