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