计数器循环管道到grep似乎意外随机

时间:2016-05-10 02:28:14

标签: linux bash unix pipe sh

尝试 grep 5 次迭代时停止循环,以便 / tmp / foo 应该只有 5 行:

n=1
while [ $n -le 2000 ]
do
    echo $n
    n=$(( $n + 1 ))
done | tee /tmp/foo | grep -q ^5

检查计数:

wc -l < /tmp/foo

输出:

34

每次重复运行以上返回不同的数字,但它不是非常随机 - 在 bash 中运行上述5000次会产生大约1500 9 s,例如,在破折号中运行5000次会导致157 106 s。

这些结果似乎比初始实验更有趣。这段代码中发生了什么?

1 个答案:

答案 0 :(得分:2)

管道是异步的。虽然tee将在grep退出并关闭其结束后第一次尝试写入管道末尾时退出,但无法知道有多少行tee将写入< em>之前 grep实际上是这样做的。这完全取决于OS调度程序。