abc
というファイルが現在のディレクトリに存在し、テキストが含まれているとします。コマンドを実行すると:
cat abc > abc
ファイルabc
の内容が消えるのはなぜですか?
なぜコマンドがその中のテキストを削除し、ファイルが空のファイルになるのですか?
物事が行われる順序のため。
あなたがするとき:
_cat abc > abc
_
_>
_は出力リダイレクト演算子であり、シェルがこれを認識すると、_O_TRUNC
_フラグとopen(2)
ie open("abc", O_TRUNC)
を使用してファイルを切り捨てモードで開きます。ファイル内には存在しません。このリダイレクトは、cat
コマンドが実行される前にシェルによって最初に実行されることに注意してください。
したがって、コマンド_cat abc
_が実行されるとき、ファイルabc
はすでに切り捨てられているため、cat
はファイルを空であると検出します。
@ heemayl's answer に追加して、発生しているシーケンスについてコードをより明確にしたい場合は、コマンドの先頭にリダイレクトを置くだけです。
> abc cat abc