Жесткие ссылки на каталоги нарушают файловую систему несколькими способами
Они позволяют создавать петли
Жесткая ссылка на каталог может ссылаться на самого родителя, который создает цикл файловой системы. Например, эти команды могут создать цикл с обратной ссылкой l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
Файловая система с циклом каталогов имеет бесконечную глубину:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Избежать бесконечного цикла при обходе такой структуры каталогов довольно сложно (хотя, например, POSIX требует find
этого).
Файловая система с такой жесткой ссылкой больше не является деревом, потому что дерево по определению не должно содержать цикл.
Они нарушают однозначность родительских каталогов
В цикле файловой системы существует несколько родительских каталогов:
cd /tmp/a/b
cd /tmp/a/b/l/b
В первом случае /tmp/a
это родительский каталог /tmp/a/b
.
Во втором случае /tmp/a/b/l
это родительский каталог /tmp/a/b/l/b
, который совпадает с /tmp/a/b
.
Таким образом, у него есть два родительских каталога.
Они умножают файлы
Файлы идентифицируются путями после разрешения символических ссылок. Так
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
это разные файлы.
Существует бесконечно много дальнейших путей к файлу. Конечно, они одинаковы по количеству инодов. Но если вы явно не ожидаете циклов, нет причин проверять это.
Жесткая ссылка на каталог также может указывать на дочерний каталог или каталог, который не является ни дочерним, ни родительским. В этом случае файл, являющийся дочерним по отношению к ссылке, будет реплицирован на два файла, идентифицированных двумя путями.
Ваш пример
$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar
Как тогда могут работать мягкие ссылки на каталоги?
Путь, который может содержать программные ссылки и даже программно-связанные циклы каталогов, часто используется только для идентификации и открытия файла. Его можно использовать как обычный линейный путь.
Но есть и другие ситуации, когда для сравнения файлов используются пути. В этом случае символические ссылки в пути могут быть разрешены в первую очередь, преобразуя его в минимальное и обычно согласованное представление, создавая канонический путь :
Это возможно, потому что все программные ссылки могут быть расширены до путей без ссылки. После этого со всеми мягкими ссылками в пути, оставшийся путь является частью дерева, где путь всегда однозначен.
Команда readlink
может разрешить путь к своему каноническому пути:
$ readlink -f /some/symlinked/path
Мягкие ссылки отличаются от того, что использует файловая система
Мягкая ссылка не может вызвать все проблемы, потому что она отличается от ссылок внутри файловой системы. Его можно отличить от жестких ссылок и при необходимости разрешить по пути без символических ссылок.
В некотором смысле добавление символических ссылок не меняет основную структуру файловой системы - она сохраняет ее, но добавляет дополнительную структуру, например уровень приложения.
От man readlink
:
NAME
readlink - print resolved symbolic links or canonical
file names
SYNOPSIS
readlink [OPTION]... FILE...
DESCRIPTION
Print value of a symbolic link or canonical file name
-f, --canonicalize
canonicalize by following every symlink in
every component of the given name recursively;
all but the last component must exist
[ ... ]