带有多个管道的Bash命令提供随机输出



有人能帮助解释shell中多管道(|(命令的以下行为吗:

场景1:

echo 1>t2.txt | echo 2>t2.txt | echo 3>t2.txt | echo 4>t2.txt&cat t2.txt

我原以为上面命令的输出是"4"(因为echo 4>t2.txt是txt文件的最后一个输入(,但实际输出是"1"。

场景2:

echo 1>t2.txt |触摸t2.txt | echo 4>t2.txt&cat t2.txt

上述命令有时提供输出为1,有时提供4

以下是计算结果的基本脚本:

result0&amp;i=0;而[$i-lt 1000];do echo 1>测试|echo 2>测试|echo 3>测验cat测试>gt;结果0;((i++((;完成&amp;排序<result0|uniq-c输出:

992 1
8 3

对这种随机性有什么解释吗?

使用-x设置进行调试可以更好地观察行为:

场景1

set -x;echo 1 > t2.txt | touch t2.txt | echo 4 > t2.txt && cat t2.txt
+ set -x
+ touch t2.txt
+ echo 4
+ echo 1
+ cat t2.txt
1

由于您是通过单独的子壳来管道化命令;最终结果";将取决于哪个子壳首先完成。

场景2

set -x;echo 1 > t2.txt | touch t2.txt | echo 4 > t2.txt && cat t2.txt
+ set -x
+ touch t2.txt
+ echo 4
+ echo 1
+ cat t2.txt 
4

最新更新