私はこれが他の質問と一種の重複であることを知っています(このソートコマンドが空のファイルを提供するのはなぜですか?)しかし、与えられた答えに基づいて質問を拡張したいと思います。
注文する
shuf example.txt > example.txt
シェルがファイルをミックスする前にカットしてブレンドする空のファイルのみを残すため、空のファイルが返されます。しかし、
cat example.txt | shuf > example.txt
予想通りスクランブルされたファイルが生成されます。
パイプメソッドは機能しますが、単純なリダイレクトが機能しないのはなぜですか?コマンドを実行する前にファイルが切り捨てられた場合、2番目の方法も空のファイルを残してはいけませんか?
ベストアンサー1
問題は、ファイルの読み取りが開始さ> 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
。