Я хочу записать вывод выполнения сценария оболочки в реальном времени, чтобы обогатить его информацией, содержащей дату и время.
Для иллюстрации у меня есть, например, сценарий этого типа, который я не должен изменять :
#!/bin/bash
for i in 2 3 1
do
echo "Waiting for $i seconds ..."
sleep $i
done
Сценарий выдает следующий результат:
Waiting for 2 seconds ...
Waiting for 3 seconds ...
Waiting for 1 seconds ...
Я пытаюсь создать вывод типа :
2021-06-16 11:44:48 [INFO] Waiting for 2 seconds ... 2021-06-16 11:44:50 [INFO] Waiting for 3 seconds ... 2021-06-16 11:44:53 [INFO] Waiting for 1 seconds ...
Я использую следующие функции оболочки для форматирования в скрипте, который запускает мой начальный скрипт:
function log {
echo `date +%Y-%m-%d" "%H:%M:%S`" $@"
if [ "$LOGFILE" != "" ]
then
echo `date +%Y-%m-%d" "%H:%M:%S`" $@" >>$LOGFILE
fi
}
function loginf {
log "[INFO] $@"
}
Я очень хорошо справляюсь с циклом while при чтении для захвата вывода моего скрипта, но я получаю все строки в в одно и то же время (конец его выполнения) и, следовательно, все строки имеют одинаковое значение даты и времени. Я пытаюсь получить строки каждый раз, когда скрипт создает строку, а не в конце выполнения.
Команда ts
из пакета moreutils
делает именно то, что вы ищете:
./script.sh | ts
Она имеет различные параметры для форматирования отметки времени. Например,
ts '%F %T [INFO]'
предоставит вам точный формат, который вы используете в своем вопросе.
Вы можете использовать ts
:
./your_script.sh | ts
. Если вам нужно что-то портативное, работающее в системах, где ts
не установлен, вы можете сделать это простым while
цикл с использованием встроенной команды read
:
./your_script.sh | while read line; do echo "$(date +'%Y-%m-%d %H:%M:%S') [INFO] $line"; done