我正在脚本、release.sh 和 caller.sh 中运行脚本(caller.sh 调用release.sh)。两者都是bash。
release.sh 包含一堆条件,其中“exit 1”表示错误。
caller.sh 包含一行“./release.sh”,然后检查 release.sh 的退出代码 - if $?大于 0 则 echo“release.sh 搞砸了”并退出。
./release.sh
if [ $? -gt "0" ] ; then
echo "release_manager exited with errors, please see the release log."
exit 1
else
echo "release manager is done."
fi
最近我决定记录release.sh,所以caller.sh中的行是:
./release.sh 2>&1 | tee release.txt
因为管道,$?是 'tee release.txt' 的退出代码,无论之前的命令如何,它始终显示为 0 :-(
我必须检查release.sh 错误并阻止调用者继续,但我也确实需要该日志。
有没有办法获取命令的退出代码前最后的?或者以不同的方式在同一命令中记录发布脚本?
我并不真正负责release.sh,我不想改变它。
答案1
由于您使用的是 bash,因此您可以在脚本中设置选项:
set -o pipefail
管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,如果所有命令都成功退出,则返回零。
或者,在管道命令之后,您可以立即查看${PIPESTATUS[0]}
管道中第一个命令的退出代码的内置变量值。
PIPESTATUS:一个数组变量,包含最近执行的前台管道中进程的退出状态值列表(可能只包含单个命令)。
答案2
我可以建议这样重写:
./release.sh > release.txt 2>&1
进而
echo $?
将返回正确的退出状态