任何人都可以向我提供有关以下问题的可能原因的任何见解。大多数情况下,我可以运行( set -o pipefail; ldd --version | head -n 1; echo $? )
并获得以下内容。
$ ( set -o pipefail; ldd --version | head -n 1; echo $? )
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
0
然后随机它将开始失败
$ ( set -o pipefail; ldd --version | head -n 1; echo $? )
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
141
我在Ubuntu 16.04 x86_64以及RHEL 7.3 ppc64le机器上看到了它的价值
答案 0 :(得分:1)
141
是EINIT
。即过程中断了。
发生的是head -1
在读取第一行后关闭其输入流。当ldd
尝试写入已关闭的管道时,它会以EINIT
失败。
通常情况下,您看不到这一点 - 程序在head
取得所需内容后退出并出现错误,但您没有看到错误结果。但是因为你set -o pipefail
,你会看到错误。
这是间歇性的,因为管道中有缓冲区,并且调度是不可预测的。有时ldd
在head
关闭管道之前完成了写作。
如果你ldd | echo
(因为echo立即关闭stdin),你可以始终看到失败,并且你可以始终看到它在ldd | cat
成功(因为cat
总是消耗直到EOF)