linux shell管道是否流水线?

时间:2016-06-03 17:16:29

标签: linux bash shell sh zsh

如果我执行类似

的操作,请提供 input.txt 文件
grep pattern1 input.txt | grep pattern2 | wc -l

是第一个命令的输出是否连续传递(一旦生成)作为第二个命令的输入?

管道是否等到第一个命令完成后才开始运行第二个命令?

3 个答案:

答案 0 :(得分:8)

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

这就是为什么

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

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

答案 1 :(得分:7)

您问题的一般答案是"是"。

HOWEVER ,某些程序such as grep itself将其结果缓冲到某个任意点。它们可能包含禁用此缓冲的选项,但您不应该依赖它们。

答案 2 :(得分:2)

管道命令同时运行。

这通常用于允许第二个程序在第一个程序完成其操作之前处理从第一个程序出来的数据。例如

grep pattern huge-file | tr a-z A-Z
即使在grep完成遍历大文件之前,

也开始以大写显示匹配的行。

类似地

grep pattern huge-file | head -n 1

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

我能想到的这两个例子解释了它们同时运行。