bash - 具有多个管道的 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
关于这种随机性的任何解释?
解决方案
使用 -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
推荐阅读
- dart - Flutter 简单的实现来处理 Bloc 工作一次的点击事件
- c++ - 如何跳过 QFile 的 N 行而不将它们临时存储在 QStrings 中?
- javascript - 使用变换将 div 滑入 div
- blazor - Blazer 服务器端 + AspNetCore.Identity
- javascript - 有没有办法获得经过 firebase 身份验证的 github 用户的用户名
- google-app-engine - 如何设置多个 URL 指向同一个 flex App Engine?
- android - RelativeLayout 内 ScrollView 的 Wrap_Content 生成空白空间
- php - 如何从 laravel 中的 json 数组中获取数据
- python - 无法在 python 2.7 上安装 pyqt5
- malware - 恶意软件二进制文件可以打包吗?