Wyślij kopię wyniku skryptu do pliku

10

Powiedzmy, że mam skrypt Zsh i chciałbym pozwolić mu wydrukować dane wyjściowe STDOUT, ale także skopiować (zrzucić) dane wyjściowe do pliku na dysku.

Ponadto skrypt zaczyna się od następującej opcji

set -o xtrace

co zmusza go do pełnego mówienia i wypisywania poleceń, które uruchamia. Chciałbym również przechwycić to wyjście w pliku na dysku.

Rozumiem, że jeśli to zrobię

./my_script.sh > log.txt

po prostu wyśle STDOUTdo log.txt, ale co, jeśli chcę widzieć dane wyjściowe w terminalu?

Przeczytałem o teei MULTIOSopcji w Zsh, ale nie jestem pewien, jak ich używać.

Kiedy robię:

./my_script | tee log.txt

Widzę dane wyjściowe na terminalu, ale plik nie log.txtwydaje się przechwytywać wszystkiego (w rzeczywistości przechwytuje prawie wszystko).

Amelio Vazquez-Reina
źródło
./my_script.sh > log.txt 2>&1
mikeserv
Wygląda na to, że szukasz scriptpolecenia. A możemyscript >&1 > log.txt 2>&1
Stéphane Chazelas

Odpowiedzi:

12

Możliwe, że twój skrypt generuje dane wyjściowe do stdouti stderr, i otrzymujesz tylko jeden z tych strumieni do pliku dziennika.

./my_script.sh | tee log.txtrzeczywiście wypisze wszystko do terminala, ale zrzuci tylko stdoutdo pliku dziennika.

./my_script.sh > log.txt 2>&1 zrobi odwrotnie, zrzucając wszystko do pliku dziennika, ale nie wyświetlając niczego na ekranie.

Sztuką jest połączenie tych dwóch z tee:

./myscript.sh 2>&1 | tee log.txt

To przekierowuje stderr( 2) do stdout( 1), a następnie potokuje stdoutdo tee, co kopiuje go do terminala i do pliku dziennika.

Odpowiednikiem zshmultios byłoby:

./myscript.sh >&1 > log.txt 2>&1

Oznacza to, że przekieruj stdout zarówno do oryginalnego stdout, jak i log.txt (wewnętrznie przez potok do czegoś, co działa jak tee), a następnie przekieruj stderr również do tego (do potoku do procesu wewnętrznego tee).

savanto
źródło
Dzięki - jeśli chodzi o twoją ostatnią linię, dlaczego nie ./myscript.sh >&1 2>&1 > log.txt? (tj. zmiana kolejności dwóch ostatnich przekierowań). Czy byłaby jakaś różnica między nimi?
Amelio Vazquez-Reina
Twój wariant nie wyświetla danych wyjściowych stdout, tylko do log.txt. Ostatni wiersz odpowiedzi (dodany przez @ StéphaneChazelas i nie przeze mnie) wyświetla dane wyjściowe dla obu.
savanto
0

nohup pozwala na kontynuowanie zadania, nawet jeśli konsola umrze lub jest zamknięta, co jest przydatne do długich kopii zapasowych itp., ale tutaj korzystamy z automatycznego rejestrowania.

nohup myscript.sh & ; tail -f nohup.out
zzapper
źródło