shuf file> fileコマンドは空のファイルを残しますが、同様のコマンドがそうでないのはなぜですか? [コピー]

shuf file> fileコマンドは空のファイルを残しますが、同様のコマンドがそうでないのはなぜですか? [コピー]

私はこれが他の質問と一種の重複であることを知っています(このソートコマンドが空のファイルを提供するのはなぜですか?)しかし、与えられた答えに基づいて質問を拡張したいと思います。

注文する

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

おすすめ記事