为什么 yes 没有填满缓冲区?

Jam*_*mie 5 command-line bash

假设我做了类似的事情yes | apt-get install foo。我知道这yes会不间断地将一堆y\n' 打印到标准输出。但apt-get只能处理其中的一些。yes为什么缓冲区没有填满?y\n它实际上只在 要求时打印 a 吗apt-get

Spa*_*awk 2

注意,这不是一个完整的答案,但我将其保留在这里,主要是因为下面有很好的评论。

y\n它实际上只在 要求时打印 a 吗apt-get

是的。管道的右侧在左侧工作的同时产生输出。此外,除非需要,左侧不会“完成”。例如,以下内容将创建一个无限循环,写入终端直到被终止。

while true; do echo foo; done
Run Code Online (Sandbox Code Playgroud)

然而,下面将打印出 10 行,然后正常退出。

while true; do echo foo; done | head
Run Code Online (Sandbox Code Playgroud)

命令完成后head,管道的左侧不再需要工作,“无限”循环也不再存在。