(2つの回答)
2年前に閉鎖されました。
これは別の質問の複製のようなものですが(なぜこの並べ替えコマンドで空のファイルが表示されるのですか?)、与えられた回答に応じて質問を拡張したいと思いました。
コマンド
shuf example.txt > example.txt
シェルがファイルをシャッフルする前に切り捨て、シャッフルする空白のファイルのみを残すため、空白のファイルを返します。ただし、
cat example.txt | shuf > example.txt
期待どおりにシャッフルされたファイルが生成されます。
単純なリダイレクトが機能しないのに、パイプライン方式が機能するのはなぜですか?コマンドを実行する前にファイルが切り捨てられた場合、2番目の方法でも空のファイルを残してはいけませんか?
承認された回答:
問題は、> example.txt
shuf example.txt
の前に、そのファイルへの書き込みを開始します それを読み始めます。まだ出力がないので、example.txt
空です、shuf
空のファイルを読み取り、shuf
として読み取ります この場合、出力は行われません。最終結果は空のままです。
他のコマンドでも同じ問題が発生する可能性があります。 > example.txt
cat example.txt
の前にファイルを強制終了する可能性があります それを読み始めます。シェルがそれらを実行する順序と、cat
にかかる時間によって異なります。 実際にファイルを開きます。
このような問題を完全に回避するには、shuf example.txt > example.txt.shuf && mv example.txt.shuf example.txt
を使用できます。 。
または、shuf example.txt --output=example.txt
を使用することもできます 代わりに。