bash脚本,如何选择登录日志文件和/或控制台

时间:2018-09-25 22:14:19

标签: bash shell scripting

我正在尝试创建一个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}

但是,这意味着没有选项可以打印到控制台,日志文件或同时打印到两者。很难同时打印到两者。

1 个答案:

答案 0 :(得分:1)

绝对有多种方法可以做到这一点,但最简单的方法可能是使事情保持简单。

在完成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

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