6

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

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

问题是每次运行脚本时都会创建一个空白日志文件,即使不存在错误也是如此。我也看过网上和几本书,但不知道如何在存在错误的情况下创建日志文件。

4

1 回答 1

7

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

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 )

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

于 2013-07-10T17:08:57.857 回答