$ 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