给定一个文件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读完输入文件之前停止处理。
我能想到的这两个例子说明它们并行运行。