web-dev-qa-db-ja.com

猫のリダイレクト

abcというファイルが現在のディレクトリに存在し、テキストが含まれているとします。コマンドを実行すると:

cat abc > abc

ファイルabcの内容が消えるのはなぜですか?
なぜコマンドがその中のテキストを削除し、ファイルが空のファイルになるのですか?

11
Tulsi Kanodia

物事が行われる順序のため。

あなたがするとき:

_cat abc > abc
_

_>_は出力リダイレクト演算子であり、シェルがこれを認識すると、_O_TRUNC_フラグとopen(2) ie open("abc", O_TRUNC)を使用してファイルを切り捨てモードで開きます。ファイル内には存在しません。このリダイレクトは、catコマンドが実行される前にシェルによって最初に実行されることに注意してください。

したがって、コマンド_cat abc_が実行されるとき、ファイルabcはすでに切り捨てられているため、catはファイルを空であると検出します。

27
heemayl

@ heemayl's answer に追加して、発生しているシーケンスについてコードをより明確にしたい場合は、コマンドの先頭にリダイレクトを置くだけです。

> abc cat abc
5
l0b0