linux shell 管道是管道化的吗?
Are linux shell pipes pipelined?
给定一个文件 input.txt 如果我做类似的事情
grep pattern1 input.txt | grep pattern2 | wc -l
第一个命令的输出是否连续传递(一旦生成)作为第二个命令的输入?
或者管道是否等到第一个命令完成后才开始运行第二个命令?
是的,它们是流水线式的——每个组件的标准输出都通过 FIFO 连接到下一个组件的标准输入,并且所有组件都是并行启动的。
这就是为什么
cat some-file | ...tools... >some-file
...通常会导致文件被截断:因为管道是同时启动的,所以最后一段(截断 some-file
以进行写入)发生在 cat
完成之前(或者经常,甚至开始)从输入读取文件。
您问题的一般答案是 "yes"。
然而,一些程序,such as grep
itself,将它们的结果缓冲到任意点。它们可能包含禁用此缓冲的选项,但您不应依赖它们可用。
并发管道命令运行。
这非常常用来允许第二个程序在第一个程序完成其操作之前处理来自第一个程序的数据。例如
grep pattern huge-file | tr a-z A-Z
甚至在 grep 完成遍历大文件之前就开始以大写形式显示匹配行。
同样
grep pattern huge-file | head -n 1
显示第一个匹配行,并可能在 grep 完成读取其输入文件之前停止处理。
我能想到的这两个例子说明它们运行同时发生。
给定一个文件 input.txt 如果我做类似的事情
grep pattern1 input.txt | grep pattern2 | wc -l
第一个命令的输出是否连续传递(一旦生成)作为第二个命令的输入?
或者管道是否等到第一个命令完成后才开始运行第二个命令?
是的,它们是流水线式的——每个组件的标准输出都通过 FIFO 连接到下一个组件的标准输入,并且所有组件都是并行启动的。
这就是为什么
cat some-file | ...tools... >some-file
...通常会导致文件被截断:因为管道是同时启动的,所以最后一段(截断 some-file
以进行写入)发生在 cat
完成之前(或者经常,甚至开始)从输入读取文件。
您问题的一般答案是 "yes"。
然而,一些程序,such as grep
itself,将它们的结果缓冲到任意点。它们可能包含禁用此缓冲的选项,但您不应依赖它们可用。
并发管道命令运行。
这非常常用来允许第二个程序在第一个程序完成其操作之前处理来自第一个程序的数据。例如
grep pattern huge-file | tr a-z A-Z
甚至在 grep 完成遍历大文件之前就开始以大写形式显示匹配行。
同样
grep pattern huge-file | head -n 1
显示第一个匹配行,并可能在 grep 完成读取其输入文件之前停止处理。
我能想到的这两个例子说明它们运行同时发生。