将bash stderr发送到logfile,但仅在存在错误时发送

bks*_*ack 5 bash stderr

我使用以下代码将stderr发送到文件.

.script >2 "errorlog.$(date)"
Run Code Online (Sandbox Code Playgroud)

问题是每次运行脚本时都会创建一个空白日志文件,即使错误不存在也是如此.我也在网上和几本书中看过,并且只有在存在错误时才能弄清楚如何创建日志文件.

che*_*ner 6

输出重定向在脚本运行之前打开文件,因此无法判断文件是否将接收任何输出.但是,如果文件结束为空,则可以立即删除该文件:

logfile="errorlog.$(date)"
# Note your typo; it's 2>, not >2
script 2> "$logfile"; [ -s "$logfile" ] || rm -f "$logfile"
Run Code Online (Sandbox Code Playgroud)

我使用-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 )
Run Code Online (Sandbox Code Playgroud)

不像重定向到文件那么简单,并且取决于非标准功能(进程替换),但也不是太糟糕.