Linux. Вывод одновременно на консоль и в файл. Команда tee.
На самом деле я искал перенаправление вывода сразу в два отдельных потока, но оказалось, что это не нужно, ибо задача сводилась к тому, чтобы отображать вывод некоей программы на экран и одновременно писать этот же вывод в 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!
Тестовый пример на GitHub
Кстати, обязательно загляните, там есть дополнительные примеры использования:
1. Команда Tee в Linux: Примеры Использования (копия).
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/08/10/linu