首页 > 解决方案 > bash 脚本,如何选择性地记录到日志文件和/或控制台

问题描述

我正在尝试创建一个 bash 脚本,可以选择将结果打印到控制台(STDOUT 和 STDERR)、日志文件或两者。

我已经让 getops 设置选项,但我似乎无法弄清楚命令。到目前为止,我有这样的事情:

# default logs to both
export LOG_COMMAND=" 2>&1 | tee ${INSTALL_LOG}"

if [ "$ONLY_CONSOLE" == "true" ] ; then
  export LOG_COMMAND=""
elif  [ "$ONLY_LOG" == "true" ] ; then
  export LOG_COMMAND=" | tee ${INSTALL_LOG}"
fi

echo "Starting script" ${LOG_COMMAND}
# ... then do more stuff ...

此脚本仅将其打印到控制台,而不会打印到日志文件:

Starting script 2>&1 | tee scriptfile.log

但我希望脚本打印到控制台和文件 scriptfile.log。

有没有人这样做过?看来 echo 命令正在将 ${LOG_COMMAND} 作为变量处理。

用这个作品替换 echo 命令将同时打印:

echo "Starting script" 2>&1 | tee -a ${INSTALL_LOG}

但是,这意味着没有打印到控制台、日志文件或两者的选项。打印到两者都是硬编码的。

标签: bashshellscripting

解决方案


肯定有不止一种方法可以做到这一点,但最简单的方法可能是保持简单。

在 getopts 完成并且您已经弄清楚了去哪里之后,您可以使用它以main正确的方式调用,并将所有其余逻辑放在 main 中(或从 main 调用)。例如:

main() {
  # do stuff
  # call other functions
  # do more stuff
}

if [ $ONLY_CONSOLE -eq 0 ]
then
  main
elif [ $ONLY_LOG -eq 0 ]
then
  main > $INSTALL_LOG 2>&1
else # both
  main 2>&1 | tee $INSTALL_LOG
fi

另一种选择是执行人员和其他流程的神秘组合,但对于少数选项,这对我来说最有意义。


推荐阅读