Bash 如何从$PIPESTATUS中捕获退出代码并使用它退出脚本?

Bash 如何从$PIPESTATUS中捕获退出代码并使用它退出脚本?,bash,pipe,Bash,Pipe,我使用$PIPESTATUS打印每个管道命令的退出代码。我现在知道管道是并行运行的,但是一旦退出代码为0,我如何让脚本退出而不是继续执行下一个命令?谢谢 我不能将set-e放在顶部,因为一旦检测到错误,脚本就会退出,但$PIPESTATUS不会显示,因为echo命令位于管道中任何失败的命令之后 set -o pipefail true | false | true || { declare -p PIPESTATUS; exit; } echo "whoops" 输出: declare -a

我使用$PIPESTATUS打印每个管道命令的退出代码。我现在知道管道是并行运行的,但是一旦退出代码为0,我如何让脚本退出而不是继续执行下一个命令?谢谢

我不能将set-e放在顶部,因为一旦检测到错误,脚本就会退出,但$PIPESTATUS不会显示,因为echo命令位于管道中任何失败的命令之后

set -o pipefail

true | false | true || { declare -p PIPESTATUS; exit; }
echo "whoops"
输出:

declare -a PIPESTATUS=([0]="0" [1]="1" [2]="0")

发件人:

pipefail

如果设置,管道的返回值是 以非零状态退出的最后(最右边)命令,如果为零,则为零 管道中的所有命令都成功退出。这个选项是 默认情况下禁用

输出:

declare -a PIPESTATUS=([0]="0" [1]="1" [2]="0")

发件人:

pipefail

如果设置,管道的返回值是 以非零状态退出的最后(最右边)命令,如果为零,则为零 管道中的所有命令都成功退出。这个选项是 默认情况下禁用


你是否在考虑设置-o pipefail可能?因此,当我将set-e放在脚本顶部时,echo“${PIPESTATUS[@]}”不会返回任何值。管道不会从一个命令前进到另一个命令;所有命令都并行运行。@chepner我昨天学的。我不想让它在管道的中央。但是一旦我从整个管道中捕获了退出代码,并且出现了错误,我想退出,而不是转到下一行。如果我将-e设置在顶部,脚本将在显示PIPESTATUS之前退出。您是否考虑
set-o pipefail
可能?因此,当我将set-e设置在脚本顶部时,echo“${PIPESTATUS[@]}”不会返回任何值。管道不会从一个命令前进到另一个命令;所有命令都并行运行。@chepner我昨天学的。我不想让它在管道的中央。但是一旦我从整个管道中捕获了退出代码,并且出现了错误,我想退出,而不是转到下一行。如果我在顶部设置-e,脚本将在显示PIPESTATUS之前退出。