Настроить способ добавления stderr в файл

У меня проблема со сценарием оболочки, который использует rsync для синхронизации 2 каталогов. Я сохраняю результат команды rsync (независимо от того, успешна она или нет) в файле с именем status, и в случае возникновения проблемы вывод stderr добавляется к файлу с именем error. Тем не менее, я не могу найти способ ввести временную метку до фактической ошибки в файле ошибки.

В конце концов, мне нужно что-то вроде этого:

if rsync source destination 2>> error # but I need to have the date before the actual error is appended! then echo "`date` - Success" >> status else echo "`date` - Failure" >> status fi 

Я также пробовал следующее:

 (rsync source destination && echo "`date` - Success" >> status || echo "`date` - Failure" >> status) 2>>error 

Единственный способ, которым я выполнял эту работу, – это сохранить файл stderr во временном файле, чтобы я мог добавить его содержимое в файл ошибки после того, как я ввел метку времени.

3 Solutions collect form web for “Настроить способ добавления stderr в файл”

Вы пробовали это?

 rsync -av blah blah 2>&1|perl -e "while(<>){s/^/`date` /g; print;}" >>logfile 

Он добавит дату и некоторые пробелы в начало строки.

Я знаю, что прошло более трех месяцев с тех пор, как я задал этот вопрос, но я подумал, что было бы неплохо показать, что я сделал в своем сценарии оболочки.

Как я описал, мне нужно было как-то поймать stderr, чтобы манипулировать им в файле журнала, например добавить временную метку. Я смог сделать это с помощью файлов и с тем, что предложил Патрик, но я хотел сохранить его как можно более простым.

Итак, вот как я это разработал:

 if ! result=$(command_that_will_produce_errors 2>&1 1>/dev/null) then echo "There was an error on $(date): $result" >> logfile else echo "Command executed successfully on $(date)" >> logfile fi 

В Wiki от Greg есть запись о добавлении временных меток в каждую строку потока, которая охватывает несколько методов, в зависимости от вашей среды. Все они сводятся к потоку потока через цикл / процесс, который добавляет метки времени; POSIX-совместимая версия:

 while IFS= read -r line; do echo "$(date +%Y%m%d-%H:%M:%S) $line" done 
  • переадресация кота
  • wget возвращает html-страницу вместо исходного файла
  • Захват всех выходных данных, ошибок, предупреждений и порядка их появления команды linux
  • Перенаправить скрипт stderr и stdout в файл, но сохранить stdout в tty?
  • Исключить параметр в команде du
  • Перенаправление вывода GREP в разные текстовые файлы в зависимости от содержимого захвата
  • Stderr сценариев оболочки с трубкой не всегда отображается
  • Почему Bash не принимает `&> & 3`, т.е. перенаправляет stdout и stderr в дескриптор файла 3?
  • Не удалось выполнить перенаправление в среде chroot
  • Можно ли дублировать дескриптор входного файла и использовать его для записи данных?
  • Перенаправление. Что такое «<>», «<&» и «> & -»?
  • Linux и Unix - лучшая ОС в мире.