在Bash中,当您将多个异步命令传递给一个使用者时会发生什么?

时间:2015-03-12 19:02:52

标签: bash asynchronous parallel-processing pipe buffer

考虑这个Bash代码:

(cmd1 & cmd2) | consumer

consumer可能会在标准输入上看到哪些可能的东西?

  1. cmd1输出,然后从cmd2输出?
  2. 来自cmd1的行与任意来自cmd2
  3. 的行任意穿插 来自cmd1
  4. 字节随意散布来自cmd2
  5. 的字节
  6. 别的什么?

1 个答案:

答案 0 :(得分:5)

您可以期待看到随机交错的数据,但如果线条较短,则很可能在大多数情况下您会看到整行交错。

由于进程将stdout重定向到管道(不是交互式设备),因此输出可能是完全缓冲的。由于缓冲区在满时写入,很可能与行的末尾不对应,您可能会看到交错缓冲区,每个缓冲区末尾都有混合行。

Posix System Interfaces, 2.5 Standard IO Streams

  

打开时,标准错误流未完全缓冲;当且仅当可以确定流不参考交互设备时,标准输入和标准输出流是完全缓冲的。

但是,无法保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效应。

这是一个快速测试:

$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117

awk程序打印在组合输出中没有出现两次的任何行,其中包括所有混合行。因此,在这种情况下,大约一千行中的一行被混合在一起。

顺便说一句,在(cmd1 & cmd2)中,只有cmd1正在后台运行。尽管如此,它们仍然是相互异步的。