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

时间:2013-07-10 16:52:39

标签: bash stderr

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

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

问题是每次运行脚本时都会创建一个空白日志文件,即使错误不存在也是如此。我已经在线阅读了几本书,并且只有在出现错误时才能弄清楚如何创建日志文件。

1 个答案:

答案 0 :(得分:5)

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

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 ) 是否成功。

您可以将其包装在一个函数中,以便于使用。

{{1}}

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