【问题标题】:How do I capture the exit codes from $PIPESTATUS and use it to exit the script?如何从 $PIPESTATUS 捕获退出代码并使用它来退出脚本?
【发布时间】:2018-08-22 21:59:24
【问题描述】:

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

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

【问题讨论】:

  • 你有没有想过set -o pipefail
  • 因此,当我将 set -e 放在脚本顶部时, echo "${PIPESTATUS[@]}" 不会返回任何值。
  • 管道不会从一个命令到另一个命令;所有命令并行运行。
  • @chepner 我昨天学到了这一点。我不希望它在管道中间退出。但是,一旦我从整个管道中捕获了退出代码,并且出现错误,我就想退出而不是转到下一行。如果我在顶部设置 -e,脚本会在 PIPESTATUS 显示之前退出。

标签: bash pipe


【解决方案1】:
set -o pipefail

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

输出:

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

来自Bash Reference Manual

pipefail

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 2020-08-12
    • 2010-11-27
    • 1970-01-01
    • 2013-08-28
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多