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 STDOUT
do log.txt
, ale co, jeśli chcę widzieć dane wyjściowe w terminalu?
Przeczytałem o tee
i MULTIOS
opcji 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.txt
wydaje się przechwytywać wszystkiego (w rzeczywistości przechwytuje prawie wszystko).
shell-script
zsh
io-redirection
pipe
output
Amelio Vazquez-Reina
źródło
źródło
./my_script.sh > log.txt 2>&1
script
polecenia. A możemyscript >&1 > log.txt 2>&1
Odpowiedzi:
Możliwe, że twój skrypt generuje dane wyjściowe do
stdout
istderr
, i otrzymujesz tylko jeden z tych strumieni do pliku dziennika../my_script.sh | tee log.txt
rzeczywiście wypisze wszystko do terminala, ale zrzuci tylkostdout
do 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
:To przekierowuje
stderr
(2
) dostdout
(1
), a następnie potokujestdout
dotee
, co kopiuje go do terminala i do pliku dziennika.Odpowiednikiem
zsh
multios byłoby: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ętrznegotee
).źródło
./myscript.sh >&1 2>&1 > log.txt
? (tj. zmiana kolejności dwóch ostatnich przekierowań). Czy byłaby jakaś różnica między nimi?stdout
, tylko dolog.txt
. Ostatni wiersz odpowiedzi (dodany przez @ StéphaneChazelas i nie przeze mnie) wyświetla dane wyjściowe dla obu.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.
źródło