我正在使用以下代码将 stderr 发送到文件。
.script >2 "errorlog.$(date)"
问题是每次运行脚本时都会创建一个空白日志文件,即使不存在错误也是如此。我也看过网上和几本书,但不知道如何在存在错误的情况下创建日志文件。
输出重定向在脚本运行之前打开文件,因此无法判断文件是否会接收任何输出。但是,如果文件为空,您可以立即删除该文件:
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 )
不像重定向到文件那么简单,并且依赖于非标准功能(进程替换),但也不算太糟糕。