Jak przekierować wyjście do pliku i stdout

W bash wywołanie foo wyświetli dowolne wyjście z tego polecenia na wyjściu standardowym.

Wywołanie foo > output spowoduje przekierowanie dowolnego wyjścia z tego polecenia do podanego pliku (w tym przypadku 'output').

Czy istnieje sposób na przekierowanie wyjścia do pliku i aby wyświetlał się na stdout?

Author: Mike, 2009-01-07

9 answers

Żądane polecenie ma nazwę tee:

foo | tee output.file

Na przykład, jeśli zależy Ci tylko na stdout:

ls -a | tee output.file

Jeśli chcesz dołączyć stderr, wykonaj:

program [arguments...] 2>&1 | tee outfile

2>&1 przekierowuje kanał 2 (stderr/błąd standardowy) do kanału 1 (stdout/standardowe Wyjście), tak że oba są zapisywane jako stdout. Jest on również kierowany do podanego pliku wyjściowego zgodnie z poleceniem tee.

Ponadto, jeśli chcesz dołączyć do pliku dziennika, użyj tee -a as:

program [arguments...] 2>&1 | tee -a outfile
 923
Author: Zoredache,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-23 17:10:56
$ program [arguments...] 2>&1 | tee outfile

2>&1 wyrzuca strumienie stderr i stdout. tee outfile pobiera strumień i zapisuje go na ekranie i do pliku "outfile".

To jest prawdopodobnie to, czego większość ludzi szuka. Prawdopodobna sytuacja jest taka, że jakiś program lub skrypt ciężko pracuje przez długi czas i produkuje dużo danych wyjściowych. Użytkownik chce okresowo sprawdzać postępy, ale chce również, aby wynik został zapisany do pliku.

Problem (szczególnie przy mieszaniu strumieni stdout i stderr) polega na tym, że istnieje zależność od strumieni spłukiwanych przez program. Jeśli, na przykład, wszystkie zapisy na stdout są Nie spłukane, ale wszystkie zapisy na stderr spłukane, to w pliku wyjściowym i na ekranie będą Nie w porządku chronologicznym.

Jest również źle, jeśli program wysyła tylko 1 lub 2 linie co kilka minut, aby zgłosić postęp. W takim przypadku, gdyby wyjście nie zostało spłukane przez program, użytkownik nie zobaczyłby nawet żadnego wyjścia na ekranie dla godzinami, bo nic z tego nie zostałoby przepchnięte przez rurę godzinami.

Aktualizacja: program unbuffer, część pakietu expect, rozwiąże problem z buforowaniem. Spowoduje to, że stdout i stderr będą natychmiast zapisywać do ekranu i Pliku i będą synchronizować je podczas łączenia i przekierowywania do tee. Np.:

$ unbuffer program [arguments...] 2>&1 | tee outfile
 443
Author: Matthew Alpert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 03:58:03

Innym sposobem, który działa dla mnie jest,

<command> |& tee  <outputFile>

Jak pokazano w gnu bash manual

Przykład:

ls |& tee files.txt

jeśli użyto'/&', błąd standardowy command1, oprócz standardowego wyjścia , jest podłączony do standardowego wejścia command2 przez przewód; jest to skrót dla 2>&1 |. To Ukryte przekierowanie błędu standardowego na standardowe wyjście jest wykonywane po wszelkich przekierowaniach określonych przez polecenie.

Aby uzyskać więcej informacji, zapoznaj się z przekierowanie

 93
Author: tsenapathy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-18 23:54:29

Możesz przede wszystkim używać Zoredache rozwiązanie , ale jeśli nie chcesz nadpisać pliku wyjściowego, powinieneś napisać tee z opcją-a w następujący sposób:

ls -lR / | tee -a output.file
 16
Author: O.Badr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:45

Coś dodać ...

Pakiet unbuffer ma problemy z obsługą niektórych pakietów w wersjach fedora i redhat unix.

Odkładanie kłopotów

Following worked for me

bash myscript.sh 2>&1 | tee output.log

Thank you ScDF & matthew Twoje dane zaoszczędziły mi dużo czasu..

 9
Author: nitinr708,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:30

Używanie tail -f output powinno zadziałać.

 6
Author: Chuck Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-14 15:43:58

Bonus odpowiedź od tego przypadku użycia przyniósł mi tutaj:

W przypadku, gdy musisz to zrobić jako inny użytkownik

echo "some output" | sudo -u some_user tee /some/path/some_file

Zauważ, że echo stanie się tak, jak ty, a zapis pliku stanie się " some_user "co NIE będzie działać, jeśli uruchomisz echo jako" some_user "i przekierujesz wyjście z > > "some_file", ponieważ przekierowanie pliku stanie się tak, jak ty.

Podpowiedź: tee obsługuje również dołączanie z flagą-a, jeśli chcesz zastąpić linię w plik jako inny użytkownik możesz wykonać sed jako żądany użytkownik.

 3
Author: jorfus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 16:29:20

< command > |& tee filename # spowoduje to utworzenie pliku "nazwa pliku" ze statusem polecenia jako zawartości, Jeśli plik już istnieje, usunie istniejącą zawartość i zapisze status polecenia.

< command > | tee >> filename # spowoduje to dodanie statusu do pliku, ale nie wyświetli statusu polecenia na standard_output (screen).

Chcę wydrukować coś za pomocą" echo " na ekranie i dołączyć te dane do pliku

echo "hi there, Have to print this on screen and append to a file" 
 0
Author: kiran sai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 16:26:40

Koszulka jest idealna do tego, ale to również sprawdzi się

ls -lr / > output | cat output
 -10
Author: kal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-19 10:41:57