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

Cal*_*vin 1 parallel-processing bash buffer asynchronous pipe

考虑一下这个Bash代码:

(cmd1 & cmd2) | consumer
Run Code Online (Sandbox Code Playgroud)

consumer标准输入可能会出现什么样的情况?

  1. 输出cmd1,然后输出cmd2
  2. 来自cmd1任意点缀的线条来自cmd2
  3. 来自cmd1任意散布的字节来自cmd2
  4. 别的什么?

ric*_*ici 5

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

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

Posix系统接口,2.5标准IO流:

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

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

这是一个快速测试:

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

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

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