Linux shellpipe道是stream水线的吗?

给定一个文件input.txt,如果我做了类似的

grep pattern1 input.txt | grep pattern2 | wc -l 

第一个命令的输出是否连续通过(一旦生成)作为第二个命令的input?

还是pipe道等待,直到第一个命令完成开始运行第二个命令?

是的,它们是流水线化的 – 每个组件的stdout通过FIFO连接到下一个stdin,所有组件都并行启动。


这就是为什么

 cat some-file | ...tools... >some-file 

…通常会导致截断的文件:因为管道是一次性启动的,所以在cat完成之前(或者经常甚至开始)从输入中读取文件,最后一块(截断some-file以进行写入)发生。

你的问题的一般答案是“是”。

但是 ,一些程序, 比如grep本身 ,会将结果缓冲到任意点。 它们可能包括禁用这种缓冲的选项,但不应该依赖它们的可用性。

管道命令同时运行。

在第一个程序完成其操作之前,这是第二个程序处理数据的非常常用的方法。 例如

 grep pattern huge-file | tr az AZ 

即使在grep完成遍历大文件之前,也开始以大写显示匹配行。

同样

 grep pattern huge-file | head -n 1 

显示第一个匹配的行,并可能在grep读完输入文件之前停止处理。

我能想到的这两个例子说明它们并行运行。