シンボリックリンクファイルをキャプチャして出力を元のファイルにリダイレクトすると、後者のファイルが空になるのはなぜですか?

シンボリックリンクファイルをキャプチャして出力を元のファイルにリダイレクトすると、後者のファイルが空になるのはなぜですか?

再現する方法は次のとおりです。

echo 'the original file' > orig
ln -s orig symb # now symb is symlinked to orig
cat symb > orig # this makes orig an EMPTY FILE, but why?

orig3番目のコマンド以降は空のファイルになりますが、なぜですか?

答え1

ファイルを開こうとすると、シンボリックリンクが評価されます。 「通常の」状況でシンボリックリンクを開くと、そのリンクが参照するファイルが開きます。だから:

ln -s original_file my_symlink
cat my_symlink > original_file

次のようによく似ています。

cat original_file > original_file

なぜコンテンツが壊れたのですか?

すべてのシェルでcommand > some_file最初に開いて切ります(0)some_fileそれから実行しcommandて結果を作成しますsome_file

したがって、cat x > xシェルが開いて切り取られたx場合それから cat x開いて読む切り取ったファイル書き込みはすべて0バイトです。

関連情報