【问题标题】:catch exit code in bash script output to screen and log将 bash 脚本输出中的退出代码捕获到屏幕并记录
【发布时间】:2019-12-12 04:34:35
【问题描述】:

我正在尝试合并 2 条单独工作的行,但我无法让它们一起工作。捕获并退出 1 的代码:

Python script.py > /logfile.log 2>&1
ret=$?
if [ $ret -ne 0 ]; then
     exit $ret
fi

要将脚本的结果输出到屏幕和日志文件:

Python script.py 2>&1 | tee /logfile.log 

我想把这两个命令结合起来,这样脚本就会输出到屏幕和日志文件,并且还会捕获退出代码 1 以在脚本失败时中止脚本。我尝试以不同的方式组合它们,但脚本要么继续运行,要么没有任何内容输出到屏幕。可以这样做吗?

【问题讨论】:

  • 顺便说一句,您的原始代码只是编写Python script.py > /logfile.log 2>&1 || exit 的椒盐脆饼方式。请参阅stackoverflow.com/questions/36313216/… - 您可以通过放置正确的 shebang 轻松摆脱脚本名称前的 Python
  • @tripleee 我尝试了该命令,它以代码 1 退出,并记录到文件,但没有输出到屏幕。
  • 确实,我指出了您原始命令中的一个错误,而不是试图回答您有关如何做到这一点的问题。

标签: bash logging output exit return-code


【解决方案1】:

使用数组 PIPESTATUS:

Python script.py 2>&1 | tee /logfile.log
ret="${PIPESTATUS[0]}"
if [[ "$ret" -ne "0" ]]; then
  exit "$ret"
fi

来自man bash

PIPESTATUS:一个数组变量(参见下面的数组),其中包含来自最- 最近执行的前台管道(可能只包含一个命令)。

【讨论】:

  • 感谢答案也帮助了我。我想问一下我是否在后台运行类似于上述脚本的脚本有没有办法跟踪它的 PIPESTATUS(就像它提到的只跟踪最近执行的前台或者我可能误解了)?
  • 我建议开始一个新问题。
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多