отправить bash stderr в файл журнала, но только если ошибка существует
Я использую следующий код для отправки stderr в файл.
.script >2 "errorlog.$(date)"
Проблема в том, что пустой файл журнала создается каждый раз, когда я запускаю скрипт, даже если ошибки не существует. Я посмотрел в интернете и в нескольких книгах, а также, и не могу понять, как создать файл журнала только при наличии ошибок.
1 ответ:
Перенаправление вывода открывает файл перед запуском скрипта, поэтому невозможно определить, получит ли файл какой-либо вывод. Однако вы можете немедленно удалить файл, если он окажется пустым:
logfile="errorlog.$(date)" # Note your typo; it's 2>, not >2 script 2> "$logfile"; [ -s "$logfile" ] || rm -f "$logfile"
Я использую
-f
на всякий случай, так как-s
может потерпеть неудачу, если$logfile
не существует, а не только если он пуст. Я использую;
для разделения команд, потому что содержит ли$logfile
что-либо, не зависит от того, удастся лиscript
.Вы можете завернуть это в функция, чтобы сделать его более удобным в использовании.
save_log () { logfile=${1:-errorlog.$(date)} cat - > "$logfile" [ -s "$logfile" ] || rm -f "$logfile" } script 2> >( save_log ) script 2> >( save_log my_logfile.txt )
Не так просто, как перенаправление на файл, и зависит от нестандартной функции (подстановка процесса), но и не так уж плохо.