отправить bash stderr в файл журнала, но только если ошибка существует


Я использую следующий код для отправки stderr в файл.

.script >2 "errorlog.$(date)"

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

1 5

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 )

Не так просто, как перенаправление на файл, и зависит от нестандартной функции (подстановка процесса), но и не так уж плохо.