首页 > 解决方案 > 具有多个管道的 Bash 命令提供随机输出

问题描述

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

场景一:

回声 1 > t2.txt | 回声 2 > t2.txt | 回声 3 > t2.txt | 回声 4 > t2.txt && 猫 t2.txt

我期望上述命令的输出为“4”(因为 echo 4 > t2.txt 是 txt 文件的最后输入),但实际输出为“1”。

场景二:

回声 1 > t2.txt | 触摸t2.txt | 回声 4 > t2.txt && 猫 t2.txt

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

这是计算结果的基本脚本:

结果0 && i=0; 而 [ $i -lt 1000 ]; 做回声1>测试| 回声2>测试| 回声 3 > 测试;猫测试>>结果0;((i++)); 完成 && 排序 <结果0 | uniq -c 输出:

992 1
  8 3

关于这种随机性的任何解释?

标签: bashshell

解决方案


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

方案 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

推荐阅读