bash - 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}
但是,这意味着没有打印到控制台、日志文件或两者的选项。打印到两者都是硬编码的。
解决方案
肯定有不止一种方法可以做到这一点,但最简单的方法可能是保持简单。
在 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
另一种选择是执行人员和其他流程的神秘组合,但对于少数选项,这对我来说最有意义。
推荐阅读
- r - 在两个无序字符向量之间执行非成对的全对全比较 --- intersect 的反面 --- all-to-all setdiff
- typescript - Typescript 在 Visual Studio Code 中找不到模块错误
- python - 在 Python 上使用 BDD/TDD 实现仪器自动化
- kubernetes - 如何从清单文件中使用 kubectl 端口转发(通常是清单文件与 kubectl 运行)
- python - 对多个数字求和的函数
- wordpress - Wordpress 博客页面不断加载
- python - Gremlin-server 通过从 gremlin-python 加载 csv 文件中的数据来创建图形
- nginx - keycloak 将 url 重定向到 http 而不是 https
- ios - 没有 ssl 证书的 SDWebImage
- java - 为什么 Maven 不从测试类生成源?