Отправить копию вывода скрипта в файл

10

Скажем, у меня есть сценарий Zsh, и я хотел бы, чтобы он выводил выходные данные STDOUT, а также копировал (выводил) свои выходные данные в файл на диске.

Более того, скрипт начинается со следующей опции

set -o xtrace

что заставляет его быть многословным и печатать, какие команды он выполняет. Я хотел бы также записать этот вывод в файл на диске.

Я понимаю, что если я сделаю

./my_script.sh > log.txt

это будет просто послать STDOUTк log.txt, но что , если я хочу , чтобы быть в состоянии увидеть выход в терминале?

Я прочитал о teeи MULTIOSвариант в Zsh, но я не уверен, как их использовать.

Когда я делаю:

./my_script | tee log.txt

Я вижу вывод на терминале, но файл log.txtне захватывает все (на самом деле он захватывает только что-нибудь).

Амелио Васкес-Рейна
источник
./my_script.sh > log.txt 2>&1
mikeserv
Похоже, вы ищете scriptкоманду. Или, может бытьmyscript >&1 > log.txt 2>&1
Стефан Шазелас

Ответы:

12

Может случиться так, что ваш скрипт производит вывод в stdoutи stderr, и вы получаете только один из этих потоков в файл журнала.

./my_script.sh | tee log.txtбудет действительно выводить все на терминал, но будет только дамп stdoutв лог-файл.

./my_script.sh > log.txt 2>&1 поступит наоборот, выгрузит все в файл журнала, но ничего не отобразит на экране.

Хитрость заключается в том, чтобы объединить их с tee:

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

Это переадресовывает stderr( 2) в stdout( 1), затем трубы stdoutв tee, который копирует его на терминал и в файл журнала.

zshMultios эквивалент будет:

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

То есть перенаправить stdout как в исходный stdout, так и в log.txt (внутренне через канал к чему-то, что работает как tee), а затем перенаправить stderr на это (в канал к внутреннему teeпроцессу).

savanto
источник
Спасибо - Что касается вашей последней строки, почему бы и нет ./myscript.sh >&1 2>&1 > log.txt? (т.е. переключение порядка двух последних перенаправлений). Будет ли какая-то разница между ними?
Амелио Васкес-Рейна
Ваш вариант не выводится на stdout, просто чтобы log.txt. Последняя строка в ответе (добавленная @ StéphaneChazelas, а не мной) выводит на оба.
Саванто
0

nohup позволяет выполнять работу, даже если консоль умирает или закрывается, что полезно для длительных резервных копий и т. д., но здесь мы используем ее автоматическое ведение журнала.

nohup myscript.sh & ; tail -f nohup.out
zzapper
источник