管道是否并行执行命令?

Ada*_*tav 3 linux bash command-line pipe

我试图更深入地了解管道和重定向。在每个指南中都说cmd1 | cmd2cmd1 将执行,并且 stdout 将与 cmd2 的 stdin 共享。但这在我看来不太好,所以我测试了它:

所以看起来 ./test.shgrep 都是并行运行的!

这是源代码:

#!/bin/bash
a=0
while :
do
        ((a=a+1))
        echo "Line number $a"
        sleep 1
done
Run Code Online (Sandbox Code Playgroud)

尝试使用不同的推荐会显示相似的结果。 管道是否平行运行?

管道和重定向如何“在幕后”工作?

xen*_*oid 6

是的,所有命令同时运行。在您的情况下,grep与 同时启动test.sh,但由于它读取其标准输入,因此它会被阻止,直到test.sh将某些内容放入其中为止,这不会立即发生。这两个进程相互配合,如果第二个进程很慢,第一个进程将填满它的标准输出输出缓冲区,并等待第二个进程读取一些内容。如果第一个很慢,则第二个在读取输入(如果没有可用的输入)时会被阻塞。

在现实生活中,第一个进程的标准输出是以相当大的块(大约 4K)(*) 写入的,因此第二个进程没有任何内容可读取,直到第一个进程写入至少 4K 的数据。您的test.sh使用echo可能有点不同,并进行行缓冲输出。

(*) 规则是,如果输出到“tty”(即终端),则它是行缓冲的:输出中的 LF 会导致实际输出发生。否则,它会按 4K 块进行缓冲。第一个进程还可以显式抑制所有缓冲,但这对性能不利。