Bash 脚本中 set -o pipelinefail 的含义是什么?

rɑː*_*dʒɑ 69 bash shell sh

set -o pipefailshell脚本开头的是什么意思?

cho*_*oba 78

man bash

管道故障

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

“管道”在哪里

command1 | command2 | command3
Run Code Online (Sandbox Code Playgroud)

如果没有pipefail,管道的返回值是管道中最后一个命令的退出状态,无论之前的命令是否失败。

例子:

command1 | command2 | command3
Run Code Online (Sandbox Code Playgroud)

  • @User123:取决于你为什么要管道,以及你用它做什么。比如说,如果您使用 cat 从 /dev/urandom 获取随机数据字节并将它们发送到 xxd 和 head,那么您可能不希望设置 pipelinefail:cat 命令永远不会成功完成。如果您使用辅助函数来更有用地注销常规命令,但您需要常规命令的退出状态,那么您就可以这样做。 (8认同)
  • 是的,这取决于。广泛使用的示例是管道中的“grep” - 如果未找到任何内容,则返回 1。但我想知道(从统计上来看)是否更常见的是希望默认检测到失败,而不是通过最后一个命令中的 0“吞掉”失败(尤其是在脚本中)。就我个人而言,我在所有脚本中启用它,并通过显式检查退出代码来解决问题。我认为启用“pipefail”是一个更明智的默认设置。 (7认同)
  • 使用管道时是否建议/有必要使用“pipefail”? (4认同)
  • @User123 取决于您是否希望管道在其组件之一失败时返回非零值。 (3认同)
  • 提示:如果子进程失败,或者尝试使用未设置的变量,或者管道失败,则“set -euo pipelinefail”退出。 (3认同)