На самом деле я искал перенаправление вывода сразу в два отдельных потока, но оказалось, что это не нужно, ибо задача сводилась к тому, чтобы отображать вывод некоей программы на экран и одновременно писать этот же вывод в log-файл.
В Linux нашлось готовое решение: команда tee
Команда tee делает следующее — берет переданный ей от другой команды или потока команд (pipe) вывод, пишет его в файл и одновременно выводит на stdout. Вывод на stdout можно переопределить дальше, например, устроить вывод на отдельный терминал, но об этом далее.
Общий синтаксис таков:
<команда>|tee [параметры] файл1 [файл2 файл3 ...]
где:
<команда> — любая команда оболочки Linux
| — обозначение перенаправления, вывод команды <команда> передается tee
файл1 [файл2 файл3 ...] — файлы, в которые необходимо вести запись.
ls | tee log.txt
Выведет список файлов текущего каталога на консоль и одновременно сохранит вывод в файл log.txt
Если добавить к команде tee параметр -a, то информация будет дозаписываться в указанные файлы. Без этого параметра файлы будут перезаписаны.
Чтобы не использовать какие-то команды, создадим тестовый скрипт tscript, десять раз выводящий на консоль случайное число:
#!/bin/bash
SEC=1
CTR=10
echo "Test script, write to STDOUT random number after $SEC sec."
while [ "$CTR" -ne 0 ];do
let "CTR=CTR-1"
printf '%x Number: %x\n' $CTR $RANDOM
sleep $SEC
done
echo "Complete!"
Теперь в каталоге со скриптом выполним:
./tscript | tee log.txt
На экран будут выведены случайные числа, они же будут в файле log.txt
./tscript | tee -a log.txt
Аналогично, только log-файл будет дополнен новыми случайными числами.
После команды tee, вывод можно перенаправить и дальше, например, можно совместить этот пример с выводом на другой терминал (копия):
./tscript | tee ./test.log >/dev/tty4
Можно пойти дальше и скрипт сделать автономным, «демонизировать» его, тогда можем, запустив следующую команду, или использовав ее в скрипте, освободить и/или текущую консоль или запускающий скрипт для дальнейших действий:
./tscript | tee ./test.log >/dev/tty4 &
Вывод на консоль четвертого терминала (tty4):

Вывод в test.log:
Test script, write to STDOUT random number after 1 sec.
9 Number: 2378
8 Number: 2cf9
7 Number: 132c
6 Number: 4a3c
5 Number: 6367
4 Number: 3384
3 Number: 5660
2 Number: 6655
1 Number: 6141
0 Number: 1870
Complete!
Кстати, обязательно загляните, там есть дополнительные примеры использования:
Pingback: Linux dialog —tailbox | Персональный блог Толика Панкова