Я дуже добре розумію поняття жорстких посилань і неодноразово читав головні сторінки для основних інструментів, таких як cp
--- та навіть останні специфікації POSIX ---. І все-таки я здивовано спостерігав таку поведінку:
$ echo john > john
$ cp -l john paul
$ echo george > george
У цей момент john
і paul
буде однаковий inode (і зміст), і george
буде відрізнятися в обох аспектах. Тепер ми робимо:
$ cp george paul
У цей момент я очікував george
і paul
мати різні номери inode, але однаковий зміст --- це очікування було виконано ---, але я також очікував, paul
що тепер буде інше число inode від john
, і для того, john
щоб все-таки мати вміст john
. Тут я здивувався. Виявляється, що копіювання файлу в шлях призначення paul
також має результат встановлення того самого файлу (того ж inode) на всіх інших шляхах призначення, які мають спільний paul
inode. Я думав, що cp
створює новий файл і переміщує його на місце, яке раніше займав старий файл paul
. Замість цього, здається, відкрити існуючий файл paul
, обрізати його та написатиgeorge
вміст у тому наявному файлі. Отже, будь-які "інші" файли з тим самим inode одночасно оновлюють "свій" вміст.
Гаразд, це систематична поведінка, і тепер, коли я знаю, на що її чекаю, я можу зрозуміти, як обійтися навколо цього, або скористатися цим, якщо це доречно. Які головоломки мені, де я повинен був бачити цю поведінку документально? Я був би здивований, якби це не було десь зафіксовано в документах, які я вже переглянув. Але, мабуть, я пропустив це, і зараз не можу знайти джерело, яке б обговорювало цю поведінку.