Intereting Posts
Отключить системные звуки KDE 4.7 переустановить клиент NFS без перезагрузки Общий объем использования памяти одним процессом Сохранить весь вывод терминала в файл Почему я могу перечислить другие процессы пользователей без разрешения root? Как клонировать сервер CentOS для виртуальной машины? контролировать реферер Apache для ограничения загрузки в файле htaccess Присоедините два файла, каждый из которых содержит два столбца, включая несогласованные строки Как подсчитать количество экземпляров слова, начинающегося с другого слова переименовать файлы mov / mts с данными exif Shell показывает, что у меня есть почта, но как я могу ее проверить Может ли Pulseaudio получать многоадресную рассылку RTP из любого источника? Определение функции оболочки: почему есть место после открытия скобки? Управление заданиями: как сохранить вывод фонового задания в переменной Что используется сначала, .bashrc или .zshrc?

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

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

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

 set -o xtrace 

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

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

 ./my_script.sh > log.txt 

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

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

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

 ./my_script | tee log.txt 

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

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

./my_script.sh | tee log.txt ./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 , который копирует его на терминал и в файл журнала.

Тестовый эквивалент zsh :

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

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

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

 nohup myscript.sh & ; tail -f nohup.out