リダイレクションに関連するシェルでの実行順序に関するこのQ&Aを考慮し、ファイルが存在しない場合は最初に作成されるため、 cat example.txt | shuf> example.txt
ファイルが存在しないことを文句を言わない-それは私が理解していることから順序を確認するだけです-それならなぜ私がこれを行うと私のシステムで約1000回ごとにシャッフルが機能するのですか(バックアップにはそれぞれ15の静的な値が含まれています彼らのライン)
for i in $(seq 1 1000); do
cp backup test
echo $i
cat test | shuf > test
cat test
done
ルールに例外があるように見えるのはどうしてですか?
承認された回答:
ここ:
cat test | shuf > test
>コード> これが意味する意味で優先されます:
(cat test) | (shuf > test)
ではない:
(cat test | shuf) > test
2つの異なるファイルを使用した場合でも、これら2つのグループに違いはありません。
同じファイルを使用する場合に重要になるのは、パイプの両側にある2つのコマンドが同時に実行されることです。 。これらのコマンドはcattest
およびshuf>test
。 >コード>
cat
に対して、「書き込みと切り捨てのために開く」を意味します 「読み取り用に開く」、読み取り、および閉じる予定です。これらの2つのことが同時に起こっているので 、それらの集合的な操作の順序間の関係は不確定 。 cat
の可能性があります シェルがshuf>test
を管理する前にファイルを丸呑みします それを切り捨てます。しかし、もっと関与しているので、それはわずかなチャンスです。 cat
の場合にのみ発生します shuf>テスト
のスケジュールに関しては非常に幸運です 。
ストーリーの道徳: これは行わないでください。代わりに2つのファイルを使用してください。