sed 命令的管道如何控制输入和输出空间中的流信息?



我正在管道几个sed命令,但我不明白信息是如何流动的。

例:

command1 | command 2 | command3

管道是否等到所有command1完成并传输到输出空间,然后再将命令 1 的所有输出空间管道传输到command2的输入空间; 或者一旦来自command1的线路传输到输出空间,它就会立即通过管道传输到命令 2 的输入空间, 无需等待剩余行完全填满command1中的其余输出空间?

我希望有人可以简要澄清这一点。

管道中的命令并行执行。它们都同时启动并同时运行。右侧进程在生成时接收左侧进程的输出。它不必等到左侧进程完成。

通常有一个与管道关联的小缓冲区,例如 4KB。处理通常以 4KB 块进行,而不是逐行进行。如果进程对此很明确或禁用缓冲,则进程可以更频繁地刷新其输出,但这是默认行为。

如果您不希望程序并行运行,则需要单独执行它们并将其输出存储在临时文件中。

command1 > cmd1.out
command2 < cmd1.out > cmd2.out
command3 < cmd2.out
rm cmd1.out cmd2.out

shell 启动三个进程并同时运行它们。 进程 1(第一个 sed(会将输出发送到进程 2(第二个 sed(,后者将等待输入准备就绪。

原则上,这可以替换为三个连续执行 sed,临时文件存储一个阶段的输出以供后续阶段读取。

最新更新