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?
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
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 są 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
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
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
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..
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ć.
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.
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"
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
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