head 如何在以下命令中停止 cat :cat /dev/urandom |头-c 10

head 如何在以下命令中停止 cat :cat /dev/urandom |头-c 10

如果我输入:

cat /dev/urandom

那么将需要永远输出数据,但是:

cat /dev/urandom | head -c 10

输出在 10 个随机字节后结束,是否head指示以某种方式cat完成其输出?

答案1

当它尝试写入没有读取器的管道时,它将cat收到一个信号(当终止时,它会自动关闭其标准输入,这也是管道读取端的唯一打开句柄)。SIGPIPEhead

如果你不知何故获取管道读取端的另一个句柄,猫不会完成,但是堵塞填满管道缓冲区后:

(仅限 Linux 的示例):

cat /dev/urandom 3</dev/stdout | head -c 10 > /tmp/junk
<staying there until you ^C>

另外,如果你得到cat到达忽略信号SIGPIPE,生成SIGPIPE信号的写入将简单地失败,将设置errnoEPIPE=Broken pipe ^1:

{ trap '' PIPE; cat /dev/urandom; } | head -c 10 >/tmp/junk
cat: write error: Broken pipe

head过程与这一切无关。事实并非如此信号,指示或根本关心cat;它只是读取它需要的任何内容,然后退出,将其留给操作系统来处理其余的所有事情。


^1后一种行为(非常烦人)是 python 脚本的默认行为:

python -c 'while 1: print("hello")' | head -n2
hello
hello
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe

相关内容