私はハードリンクの概念を非常によく理解しており、cp
---そして最近のPOSIX仕様---のような基本的なツールのマニュアルページを何度も読みました。それでも、私は次の動作を観察して驚いた:
$ echo john > john
$ cp -l john paul
$ echo george > george
この時点john
でpaul
、同じiノード(およびコンテンツ)を持ちgeorge
、両方の点で異なります。今私たちは:
$ cp george paul
この時点で、私は期待george
とpaul
異なるinode番号が、同じ内容---この期待が満たされたを持っている---しかし、私はまた、予想paul
今から別のinode番号を持っているjohn
とのために、john
まだコンテンツを持っていますjohn
。これは私が驚いた場所です。ファイルをコピー先パスにコピーすると、paul
その同じファイル(同じiノード)を、iノードを共有する他のすべてのコピー先パスにインストールする結果にもなりますpaul
。cp
新しいファイルを作成し、以前は古いファイルで占められていた場所に移動することを考えていましたpaul
。代わりに、既存のファイルを開きpaul
、切り捨てて、書き込むことですgeorge
のコンテンツを既存のファイルに追加します。したがって、同じiノードを持つ「その他」のファイルは、「それらの」コンテンツを同時に更新します。
わかりました、これは体系的な動作であり、それを期待することがわかったので、必要に応じて回避方法を利用したり、利用したりできます。この動作が文書化されるのを見るはずだったのは、私にとって何が困ったことですか?私がすでに見た文書のどこかに文書化されていない場合、私は驚くでしょう。しかし、どうやら私はそれを見逃したようで、この振る舞いについて議論するソースを見つけることができません。