管道是否并行执行命令?

管道是否并行执行命令?

我正在尝试更深入地了解管道和重定向。每个指南都说cmd1 | cmd2cmd1 将执行,并且 stdout 将与 cmd2 的 stdin 共享。但这让我不太满意,所以我测试了一下:

因此看起来 ./test.shgrep 正在运行平行线!

以下是源代码:

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

尝试使用不同的注释会得到类似的结果。 管道是否平行运行?

管道和重定向如何在“幕后”发挥作用?

答案1

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

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

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

答案2

您真正看到的是所谓的flow control,和/或(重新)定向 - 再次;flow control,或stdinstdout(标准输入/标准输出)。

我希望我上述的陈述能帮助你更好地理解故意的发生什么,以及你可以做些什么来改善预计

管道或“管道” stdout,仅仅指示 stdout在多数情况下。

平行是真的另一个名字隨機。 你可以试图同时运行 2 个不同/相同的命令/输出。但预期同步运行是不明智的,因为它不太可能发生。

对于你的例子;在这里你介绍了所谓的有条件的。与路标或交通信号灯非常相似。这些有条件的(編號)直接的 流动基于状况。在您的示例中,尽管“健康)状况” - 尽管 , 做. 一般条件重定向 stdinstdout

直接回答你的两个直接问题

  1. 管道是否平行

不,不一定。至少在普通的“平行” (串联) 的感觉。

pipe 火 (发起) 2工作同时。甚至相同的工作两次

  1. 管道和重定向如何在“幕后”发挥作用?

我希望上面我已经为你更好地说明了这一点。:)

或者

cat ./ASCII | grep somename >./output

以上cat ./ASCII输出stdout)。从而变成输入stdin)通过管道|)为grep somename。即(重新)定向>)到其最终输出./output

相关内容