linux shell管道是否流水线?

JC1*_*JC1 3 linux bash shell zsh sh

给定一个文件input.txt,如果我做的话

grep pattern1 input.txt | grep pattern2 | wc -l
Run Code Online (Sandbox Code Playgroud)

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

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

Cha*_*ffy 8

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


这就是为什么

cat some-file | ...tools... >some-file
Run Code Online (Sandbox Code Playgroud)

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


Ign*_*ams 7

你问题的一般答案是"是".

然而,一些程序,例如它grep自己,将它们的结果缓冲到某个任意点.它们可能包含禁用此缓冲的选项,但您不应该依赖它们.