BASH 4:tee 到日志文件,故障转移到 /dev/null

BASH 4:tee 到日志文件,故障转移到 /dev/null

我有一个尝试记录其操作的脚本。那里有一个 T 恤可以完成所有这些工作。目前,当 $LOG_FILE 无法写入时,脚本就会终止。相反,我希望它不写入日志文件。

在脚本中,记录的部分如下所示:

for foo in "${array_of_foos[@]"; do
  {get bar from foo} | sort -u
done | xargs -n 100 -P 20 bar_processor.sh |& tee "$LOG_FILE"

当用户不想写入日志文件时,我可以设置LOG_FILE=/dev/null还是有更好的方法来处理?请注意,此脚本不是也永远不会以 root 身份运行。

答案1

为了处理可写的日志文件或尚不存在但位于可写目录中的日志文件,最可靠的方法是尝试:

LOG_FILE=loggit.log
( printf "" >>"$LOG_FILE" ) 2>/dev/null || LOG_FILE=/dev/null

# ...
echo "Stuff to be logged" >>"$LOG_FILE"
some | pipeline >>"$LOG_FILE"

在您的特定情况下,您希望将输出复制到标准输出并保存到日志文件中,因此您现在可以执行以下操作:

some | pipeline | tee -a "$LOG_FILE"

如果您想根据是否有有意义的日志文件执行不同的操作,我们可以使用更复杂的场景来处理此问题:您可以LOG_FILE=在上面的代码片段中设置(即什么都没有),然后在后面的代码中测试它:

[[ -n "$LOG_FILE" ]] && echo "Stuff to be logged" >>"$LOG_FILE"

并且您可以无条件执行代码,同时如果可能的话仍然进行日志记录,使用如下结构:

some | pipeline >>"${LOG_FILE:-/dev/null}"
some | pipeline | tee -a "${LOG_FILE:-/dev/null}"

另请参阅我对另一个问题的回答将文本附加到文件的方法"${LOG_FILE:-/dev/null}"关于避免每次重复的方法。

相关内容