在Bash中,当您将多个异步命令传递给一个使用者时会发生什么?
考虑以下Bash代码:在Bash中,当您将多个异步命令传递给一个使用者时会发生什么?,bash,asynchronous,parallel-processing,pipe,buffer,Bash,Asynchronous,Parallel Processing,Pipe,Buffer,考虑以下Bash代码: (cmd1 & cmd2) | consumer 消费者在其标准输入上可能会看到什么 从cmd1输出,然后从cmd2输出 来自cmd1的行与来自cmd2的行任意穿插在一起 来自cmd1的字节与来自cmd2的字节任意分布 还有别的吗 您可以期望看到随机交错的数据,尽管如果行较短,很可能在大多数情况下会看到整行交错 由于进程将其stdout重定向到非交互式设备的管道,因此输出很可能会被完全缓冲。由于缓冲区已满时将被写入,很可能与行尾不对应,因此您可能会看到交错的缓冲
(cmd1 & cmd2) | consumer
消费者在其标准输入上可能会看到什么
cmd1
输出,然后从cmd2
输出cmd1
的行与来自cmd2
的行任意穿插在一起cmd1
的字节与来自cmd2
的字节任意分布您可以期望看到随机交错的数据,尽管如果行较短,很可能在大多数情况下会看到整行交错 由于进程将其
stdout
重定向到非交互式设备的管道,因此输出很可能会被完全缓冲。由于缓冲区已满时将被写入,很可能与行尾不对应,因此您可能会看到交错的缓冲区,每个缓冲区的末尾都有交错的行
:
打开时,标准错误流未完全缓冲;当且仅当可以确定流不引用交互设备时,标准输入和标准输出流被完全缓冲
但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效果
下面是一个快速测试:
$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117
awk
程序打印组合输出中未出现两次的任何行,包括所有混合行。所以在这种情况下,大约千分之一的线是混合的
顺便说一下,在
(cmd1和cmd2)
中,只有cmd1
在后台运行。但是,它们之间仍然是异步的。您可以看到随机交错的数据,尽管如果行较短,很可能在大多数情况下会看到整行交错
由于进程将其stdout
重定向到非交互式设备的管道,因此输出很可能会被完全缓冲。由于缓冲区已满时将被写入,很可能与行尾不对应,因此您可能会看到交错的缓冲区,每个缓冲区的末尾都有交错的行
:
打开时,标准错误流未完全缓冲;当且仅当可以确定流不引用交互设备时,标准输入和标准输出流被完全缓冲
但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效果
下面是一个快速测试:
$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117
awk
程序打印组合输出中未出现两次的任何行,包括所有混合行。所以在这种情况下,大约千分之一的线是混合的
顺便说一下,在
(cmd1和cmd2)
中,只有cmd1
在后台运行。不过,它们彼此之间仍然是异步的。{{sleep 1;echo 1;sleep 2;echo 2;}&{sleep 1;echo 3;sleep 2;echo 4;};}cat作为一个快速测试。运行几次,您应该会看到两行交替。这里有一个更有趣的测试:((while true;do echo line1;done)和(python-uc'while true:print(“line2”))| less
——在我的系统上,您有时会看到“line2line1”都在一行{sleep 1;echo one;sleep 2;echo two;}&{sleep 1;echo three;sleep 2;echo three;};}cat
作为一个快速测试。运行几次,您应该会看到两行交替出现。下面是一个更有趣的测试:((while true;do echo line1;done)&(python-uc'while true:print(“line2”))\less
——在我的系统上,您有时会看到“line2line1”都在一行上