$ 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