Настроить способ добавления 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 
  • Должен ли я использовать одиночные или двойные угловые скобки для перенаправления на / dev / null?
  • Как просмотреть вывод текущего процесса в другом сеансе bash?
  • Наследовать перенаправления IO из сценария в другой
  • Что делают команды `echo $?` И `ls >> $ File 2> & 1`?
  • Как я могу основать имя файла с уже существующей переменной?
  • Почему на выходе «echo 123> (cat)» есть «/ dev / fd / 63»?
  • Многократное перенаправление файлов с помощью awk и поиск
  • Как перенаправить максимальный результат на один процессор в файл?
  • В чем разница между этими четырьмя командами (fifo, замещение процесса, перенаправление ...)
  • Основы оболочки Linux: как я могу проверить статус файловых дескрипторов, (где перенаправляются) прямо сейчас без lsof?
  • Заполнение вкладки bash не работает в & & redirection
  • Linux и Unix - лучшая ОС в мире.