Команда, которую вы хотите, имеет имя tee
:
foo | tee output.file
Например, если вы только заботитесь о stdout:
ls -a | tee output.file
Если вы хотите включить stderr, do:
program [arguments...] 2>&1 | tee outfile
2>&1
перенаправляет канал 2 (stderr / стандартная ошибка) в канал 1 (стандартный вывод / стандартный вывод), так что оба они записываются как stdout. Кроме того, если вы хотите добавить в файл журнала, используйте tee -a
как:
program [arguments...] 2>&1 | tee -a outfile
Что-то добавить ...
В пакете unbuffer есть проблемы с поддержкой некоторых пакетов в версиях fedora и redhat unix.
Отказ от проблем
После работы для меня
bash myscript.sh 2>&1 | tee output.log
Спасибо ScDF & amp; matthew ваши входы сэкономили мне много времени.
blockquote>
< command > |& tee filename
# это создаст файл «filename» с статусом команды в качестве содержимого. Если файл уже существует, он удалит существующее содержимое и запишет статус команды.
< command > | tee >> filename
# this добавит статус к файлу, но он не распечатает статус команды на стандартном_выпуске (screen).
Я хочу что-то напечатать, используя «эхо» на экране и добавив эти эхо-данные в файл
echo "hi there, Have to print this on screen and append to a file"
Бонусный ответ, так как этот прецедент привел меня сюда:
В случае, когда вам нужно сделать это как какой-то другой пользователь
echo "some output" | sudo -u some_user tee /some/path/some_file
Обратите внимание, что эхо произойдет так как вы и запись файла будут выполняться как «some_user», что НЕ будет работать, если вы должны запустить echo как «some_user» и перенаправить вывод с помощью «some_file», потому что перенаправление файлов произойдет как вы.
Подсказка: tee также поддерживает добавление с флагом -a, если вам нужно заменить строку в файле в качестве другого пользователя, который вы могли бы выполнить sed в качестве желаемого пользователя.
$ program [arguments...] 2>&1 | tee outfile
2>&1
сбрасывает потоки stderr и stdout. tee outfile
берет поток, который он получает, и записывает его на экран и в файл «outfile».
Вероятно, это то, что большинство людей ищут. Вероятная ситуация - это некоторая программа или сценарий, который долгое время работает и производит много выходных данных.
Проблема (особенно при смешивании потоков stdout и stderr) заключается в том, что существует зависимость от потоков, программа. Если, например, все записи в stdout являются , а не красными, но все записи в stderr сброшены , тогда они выйдут из хронологического порядка на выходе файл и на экране.
Это также плохо, если программа выводит только 1 или 2 строки каждые несколько минут, чтобы сообщить о прогрессе. В таком случае, если выход не был сброшен программой, пользователь не будет даже видеть какой-либо вывод на экране в течение нескольких часов, потому что ни один из них не будет проталкиваться через трубу в течение нескольких часов.
Обновление: программа unbuffer
, часть пакета expect
, решит проблему буферизации. Это заставит stdout и stderr немедленно записывать на экран и файл и синхронизировать их при объединении и перенаправлении на tee
. Например ::
$ unbuffer program [arguments...] 2>&1 | tee outfile
с использованием tail -f output
должен работать.
tee идеально подходит для этого, но это также выполнит задание
ls -lr / > output | cat output
Другим способом, который работает для меня, является
<command> |& tee <outputFile>
, как показано в gnu bash manual
Пример:
ls |& tee files.txt
Если используется '| & amp;', стандартная ошибка command1, в дополнение к ее стандартным выводам, подключается к стандартным входам command2 через канал; это сокращенно 2> & amp; 1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых переназначений, заданных командой.