SIGPIPE 后的潜在故障

SIGPIPE 后的潜在故障

在 CI 服务器上运行 bash 脚本时,我收到错误代码 141,但无法在本地重现。

经过一番搜索,听起来错误 141 表示 a PIPEFAIL,而我有一个

set -o pipefail

在脚本的顶部。

但是,我想知道导致管道失败的底层错误代码是什么。有没有办法提取失败命令的错误代码?或者我是否需要重组脚本以不使用管道来实现这一点?

答案1

由于它是 bash 你可能会考虑 PIPESTATUS

command exit 1 | command exit 2 | command exit 3 | foobar; declare -p PIPESTATUS

在未找到警告之后,foobar您应该获得以下值PIPESTATUS

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

答案2

$?141 是进程因信号 13 退出时获得的值,在 Linux 上是SIGPIPE(请参阅信号(7))。这就是进程尝试写入没有读取器的管道时所得到的结果。通常您不会看到该返回值,因为管道的返回状态是其中最后一个进程的状态。但是通过pipefail设置,Bash 返回最后一个失败价值。

$ (echo x; sleep 1; echo y) | head -1 >/dev/null ; echo $?
0

$ set -o pipefail
$ (echo x; sleep 1; echo y) | head -1 >/dev/null ; echo $?
141

相关内容