リダイレクト関連シェルの実行順序が私のシステムで約1000回ハングするのはなぜですか?

リダイレクト関連シェルの実行順序が私のシステムで約1000回ハングするのはなぜですか?

考えるとこのQ&Aリダイレクトに関連するシェルの実行順序に関して、ファイルが存在しない場合、ファイルが存在しないと文句を言わないように最初に生成されるというcat example.txt | shuf > example.txt事実にもかかわらず、これは私の理解に基づく確認です。私のシステムで約1,000回に1回発生します(バックアップには各行に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

2つの異なるファイルを使用しても、2つのグループ間に違いはありません。

同じファイルで作業するときに重要なのは、パイプの両側にある2つのコマンドです。同時実行。これらのコマンドcat testはとですshuf > test>「書き込みと切り抜きのために開く」を意味し、「読み込みのcatために開く」とは、読み込みと閉じを意味する。この二つのことが起きているから同時に、彼らの集団的な運用順序の間の関係は次のとおりです。無期限。シェルがファイルの切り捨てを管理する前にcatファイルを取得できます。shuf > testしかし、より多くの要因が関連しているので、これは小さな機会です。cat非常に幸運な状況でのみ発生します。スケジューリングshuf > test

物語の教訓:これをしないでください。代わりに2つのファイルを使用してください。

関連情報