На самом деле я искал перенаправление вывода сразу в два отдельных потока, но оказалось, что это не нужно, ибо задача сводилась к тому, чтобы отображать вывод некоей программы на экран и одновременно писать этот же вывод в 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 | Персональный блог Толика Панкова