$ program [arguments...] 2>&1 | tee outfile
2>&1
выводит потоки stderr и stdout
tee outfile
берет полученный поток и записывает его на экран и в файл «outfile».
Это, вероятно, то, что ищет большинство людей. Скорее всего, какая-то программа или скрипт долго работают и выдают много результата. Пользователь хочет периодически проверять его на предмет прогресса, но также хочет, чтобы вывод был записан в файл.
Проблема (особенно при смешивании потоков stdout и stderr) состоит в том, что существует зависимость от потоков, сбрасываемых программой. Если, например, все записи на стандартный вывод будут не покраснел, но все записи в STDERR являются покраснел, то они будут в конечном итоге из хронологической последовательности в выходном файле и на экране.
Также плохо, если программа выдает только 1 или 2 строки каждые несколько минут, чтобы сообщить о прогрессе. В таком случае, если вывод не был сброшен программой, пользователь даже часами не будет видеть вывод на экране, потому что ни один из них не будет проталкиваться через канал в течение нескольких часов.
Обновление: программа unbuffer
, входящая в expect
пакет, решит проблему буферизации. Это заставит stdout и stderr немедленно записать на экран и в файл и синхронизировать их при объединении и перенаправлении на tee
. Например:
$ unbuffer program [arguments...] 2>&1 | tee outfile