有人能帮助解释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&;i=0;而[$i-lt 1000];do echo 1>测试|echo 2>测试|echo 3>测验cat测试>gt;结果0;((i++((;完成&;排序<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