在 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