Я очень хорошо понимаю понятие жестких ссылок и несколько раз читал справочные страницы по основным инструментам, таким как 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) по всем другим путям назначения, которые совместно используют paulinode. Я думал, что cpсоздает новый файл и перемещает его в место, ранее занимаемое старым файлом paul. Вместо этого он, похоже, открывает существующий файл paul, обрезает его и пишетgeorgeсодержание в этот существующий файл. Следовательно, любые «другие» файлы с таким же индексом обновляются «своим» содержимым одновременно.
Хорошо, это систематическое поведение, и теперь, когда я знаю, что ожидать этого, я могу понять, как обойти это или воспользоваться этим, в зависимости от обстоятельств. Что меня озадачивает, когда я должен был увидеть это поведение задокументированным? Я был бы удивлен, если бы это не было документировано где-то в документах, на которые я уже смотрел. Но, видимо, я пропустил это, и теперь не могу найти источник, который обсуждает это поведение.