在我的系统上,与重定向相关的 shell 中的执行顺序怎么会被打乱大约 1000 次呢?

在我的系统上,与重定向相关的 shell 中的执行顺序怎么会被打乱大约 1000 次呢?

考虑到本次问答关于 shell 中与重定向相关的执行顺序,尽管事实上,如果文件不存在,它会首先创建,这样cat example.txt | shuf > example.txt就不会抱怨该文件不存在 - 这只是确认来自我的理解 - 那么为什么当我这样做时,在我的系统上大约每千次就会进行一次洗牌(备份包含 15 个静态值,每个值都在其行上)

for i in $(seq 1 1000); do
    cp backup test
    echo $i
    cat test | shuf > test
    cat test
done

看似如此,怎么可能会有例外呢?规则

答案1

这里:

cat test | shuf > test

>优先的含义是:

(cat test) | (shuf > test) 

并不是:

(cat test | shuf) > test

尽管如果我们使用两个不同的文件,这两个分组之间无论如何都不会有任何差异。

当您使用同一个文件时,重要的是管道两侧的两个命令并发执行。这些命令是cat testshuf > test>表示“打开以进行写入和截断”,而cat将“打开以进行读取”,读取并关闭。既然这两件事正在发生同时,它们的集体运算顺序之间的关系是不定。在 shell 管理截断文件之前,有可能cat会获取该文件。shuf > test但这是一个很小的机会,因为涉及的因素更多。只有cat在非常幸运的情况下才会发生调度shuf > test

故事的寓意:不要这样做——改用两个文件。

相关内容