Linux 奇怪的管道故障案例
有人能告诉我以下问题的可能原因吗。大多数情况下,我可以运行Linux 奇怪的管道故障案例,linux,bash,pipe,ldd,Linux,Bash,Pipe,Ldd,有人能告诉我以下问题的可能原因吗。大多数情况下,我可以运行(set-o pipefail;ldd--version | head-n1;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 $?
(set-o pipefail;ldd--version | head-n1;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机器上看到了它的价值,它是
EINIT
。i、 过程被中断
发生的情况是,head-1
在读取第一行后关闭其输入流。当ldd
尝试写入关闭的管道时,它会失败,并显示EINIT
通常情况下,您看不到这一点-程序在head
获取了它想要的内容后会带着错误退出,但您看不到错误结果。但是因为您已经设置了-o pipefail,所以您看到了错误
这是间歇性的,因为管道中有一个缓冲区,并且调度是不可预测的。有时ldd
在head
关闭管道之前已完成写入
如果您使用ldd | echo
(因为echo会立即关闭stdin),您可以始终看到失败,并且您可以始终看到它使用ldd | cat
成功(因为cat
在EOF之前始终消耗)。我确信这是知识库中已有内容的重复;只需要找到它……啊,