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

![[info]](http://lj.rossia.org/img/userinfo.gif)