Если вы говорите о современной отметке времени в каждой строке, это то, что вы, вероятно, захотите сделать в своем реальном сценарии (но см. Ниже для изящного решения, если у вас нет полномочий изменить его) , Если вы хотите, чтобы маркер даты находился в отдельной строке до того, как ваш скрипт начал писать, я бы использовал:
( date 1>&2 ; myscript.sh ) 2>error.log
Вам нужен трюк для передачи stderr через другую программу, которая может добавлять временные метки к каждой строке. Вы можете сделать это с помощью программы на C, но есть гораздо более хитрый способ, используя просто bash
.
Сначала создайте скрипт, который будет добавлять метку времени к каждой строке (она называется predate.sh
):
#!/bin/bash
while read line ; do
echo "$(date): ${line}"
done
Например:
( echo a ; sleep 5 ; echo b ; sleep 2 ; echo c ) | ./predate.sh
производит:
Fri Oct 2 12:31:39 WAST 2009: a
Fri Oct 2 12:31:44 WAST 2009: b
Fri Oct 2 12:31:46 WAST 2009: c
Тогда вам понадобится еще один трюк, который может поменять stdout и stderr, это маленькое чудовище здесь:
( myscript.sh 3>&1 1>&2- 2>&3- )
Тогда просто объединить два трюка, отметив время stdout
и перенаправив его в ваш файл:
( myscript.sh 3>&1 1>&2- 2>&3- ) | ./predate.sh >error.log
Следующая транскрипция показывает это в действии:
pax> cat predate.sh
#!/bin/bash
while read line ; do
echo "$(date): ${line}"
done
pax> cat tstdate.sh
#!/bin/bash
echo a to stderr then wait five seconds 1>&2
sleep 5
echo b to stderr then wait two seconds 1>&2
sleep 2
echo c to stderr 1>&2
echo d to stdout
pax> ( ( ./tstdate.sh ) 3>&1 1>&2- 2>&3- ) | ./predate.sh >error.log
d to stdout
pax> cat error.log
Fri Oct 2 12:49:40 WAST 2009: a to stderr then wait five seconds
Fri Oct 2 12:49:45 WAST 2009: b to stderr then wait two seconds
Fri Oct 2 12:49:47 WAST 2009: c to stderr
Как уже упоминалось, predate.sh
будет ставить перед каждой строкой метку времени, а tstdate.sh
- это просто тестовая программа для записи в stdout
и stderr
с определенными временными промежутками.
Когда вы запускаете команду, вы фактически записываете "d to stdout"
в stderr (но это ваше устройство TTY или что-то еще, что stdout
могло быть при запуске). Отметка времени stderr
строк записывается в нужный файл.