命令**之前**最后的退出代码?

命令**之前**最后的退出代码?

我正在脚本、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 $?

将返回正确的退出状态

相关内容