【问题标题】:Bash command with multiple pipe is providing random output [duplicate]具有多个管道的 Bash 命令提供随机输出 [重复]
【发布时间】:2021-01-14 11:38:52
【问题描述】:

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

场景 1:

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

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

场景 2:

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

上面的命令有时输出为 1 有时为 4

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

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

992 1
  8 3

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

【问题讨论】:

  • 管道组件异步运行。打开t2.txt 以同时写入四个不同的子shell,您会遇到竞争条件。

标签: bash shell


【解决方案1】:

使用 -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

由于您通过单独的子 shell 传递命令,因此“最终结果”将取决于哪个子 shell 先完成。

场景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

【讨论】:

  • 感谢@Raman Sailopal 的解释。
  • 没问题。如果解决方案有帮助。请投票并接受。
猜你喜欢
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多