Когда скрипт выполняет много команд, хочется: видеть вывод в реальном времени, сохранить лог в файл, добавить метки времени и не тормозить скрипт тяжелым tee в цикле.
Вот асинхронный способ, как это сделать.
▪️ Подход: через mkfifo и фоновый логгер
#!/bin/bash
LOG_FILE="script.log"
PIPE="/tmp/pipe.$$"
# создаем именованный канал
mkfifo "$PIPE"
# логгер: читает из канала, добавляет таймштамп и пишет в файл
tee "$LOG_FILE" < "$PIPE" |
while IFS= read -r line; do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $line"
done &
# перенаправим stdout и stderr скрипта в канал
exec > "$PIPE" 2>&1
# ———————————————
echo "Скрипт стартовал"
sleep 1
echo "Работаем..."
ls /nonexistent/path
echo "Завершено"
# ———————————————
wait
rm "$PIPE"
🌟 Что получаем:
📍 Вывод в терминале с метками времени
📍 Лог сохраняется в файл без stdout-мусора
📍 Работает асинхронно: скрипт не ждёт tee/while
📍 Поддерживает stderr
Файл script.log будет без меток времени - идеально для машинной обработки
На экране - человекочитаемый лог
BashTex 📱 #bash #utils