Я очень хорошо понимаю понятие жестких ссылок и несколько раз читал справочные страницы по основным инструментам, таким как cp
- и даже последние спецификации POSIX. Тем не менее я был удивлен, наблюдая следующее поведение:
$ echo john > john
$ cp -l john paul
$ echo george > george
На данный момент john
и paul
будет иметь одинаковый инод (и контент), и george
будет отличаться в обоих отношениях. Теперь мы делаем:
$ cp george paul
В этот момент я ожидал george
и paul
иметь разные номера индексных дескрипторов , но то же самое содержание --- это ожидание сбылось --- но я также ожидал , paul
чтобы теперь имеют разное количество индексных дескрипторов из john
, и john
до сих пор содержание john
. Это где я был удивлен. Оказывается, что копирование файла в путь назначения paul
также приводит к установке того же файла (того же самого inode) по всем другим путям назначения, которые совместно используют paul
inode. Я думал, что cp
создает новый файл и перемещает его в место, ранее занимаемое старым файлом paul
. Вместо этого он, похоже, открывает существующий файл paul
, обрезает его и пишетgeorge
содержание в этот существующий файл. Следовательно, любые «другие» файлы с таким же индексом обновляются «своим» содержимым одновременно.
Хорошо, это систематическое поведение, и теперь, когда я знаю, что ожидать этого, я могу понять, как обойти это или воспользоваться этим, в зависимости от обстоятельств. Что меня озадачивает, когда я должен был увидеть это поведение задокументированным? Я был бы удивлен, если бы это не было документировано где-то в документах, на которые я уже смотрел. Но, видимо, я пропустил это, и теперь не могу найти источник, который обсуждает это поведение.