Dowiązania twarde katalogów niszczą system plików na wiele sposobów
Pozwalają tworzyć pętle
Twarde łącze do katalogu może prowadzić do samego rodzica, który tworzy pętlę systemu plików. Na przykład te polecenia mogą utworzyć pętlę z łączem zwrotnym l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
System plików z pętlą katalogów ma nieskończoną głębokość:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Unikanie nieskończonej pętli podczas przechodzenia przez taką strukturę katalogów jest nieco trudne (chociaż na przykład POSIX wymaga find
tego).
System plików z tego rodzaju twardym łączem nie jest już drzewem, ponieważ drzewo nie może z definicji zawierać pętli.
Przełamują jednoznaczność katalogów nadrzędnych
W pętli systemu plików istnieje wiele katalogów nadrzędnych:
cd /tmp/a/b
cd /tmp/a/b/l/b
W pierwszym przypadku /tmp/a
jest katalogiem nadrzędnym /tmp/a/b
.
W drugim przypadku /tmp/a/b/l
katalog nadrzędny /tmp/a/b/l/b
jest taki sam jak /tmp/a/b
.
Ma więc dwa katalogi nadrzędne.
Mnożą pliki
Pliki są identyfikowane przez ścieżki, po rozwiązaniu dowiązań symbolicznych. Więc
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
to różne pliki.
Istnieje nieskończenie wiele innych ścieżek do pliku. Są one oczywiście takie same pod względem liczby i-węzłów. Ale jeśli nie oczekujesz wyraźnie pętli, nie ma powodu, aby to sprawdzać.
Twarde łącze do katalogu może również wskazywać na katalog podrzędny lub katalog, który nie jest ani dzieckiem ani rodzicem żadnej głębokości. W takim przypadku plik będący dzieckiem łącza zostanie zreplikowany do dwóch plików, identyfikowanych przez dwie ścieżki.
Twój przykład
$ 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
Jak zatem mogą działać miękkie linki do katalogów?
Ścieżka, która może zawierać softlinki, a nawet miękkie pętle katalogów, jest często używana tylko do identyfikacji i otwarcia pliku. Można go wykorzystać jako normalną ścieżkę liniową.
Istnieją jednak inne sytuacje, w których ścieżki są używane do porównywania plików. W takim przypadku dowiązania symboliczne na ścieżce można najpierw rozwiązać, przekształcając je w minimalną i powszechnie uzgodnioną reprezentację, tworząc ścieżkę kanoniczną :
Jest to możliwe, ponieważ wszystkie miękkie linki można rozwinąć do ścieżek bez łącza. Po zrobieniu tego ze wszystkimi miękkimi linkami na ścieżce, pozostała ścieżka jest częścią drzewa, gdzie ścieżka jest zawsze jednoznaczna.
Polecenie readlink
może rozwiązać ścieżkę do ścieżki kanonicznej:
$ readlink -f /some/symlinked/path
Miękkie linki różnią się od tego, z czego korzysta system plików
Miękkie łącze nie może powodować wszystkich problemów, ponieważ różni się od łączy w systemie plików. Można go odróżnić od twardych łączy i w razie potrzeby przekształcić w ścieżkę bez dowiązań symbolicznych.
W pewnym sensie dodanie dowiązań symbolicznych nie zmienia podstawowej struktury systemu plików - zachowuje ją, ale dodaje więcej struktury, jak warstwa aplikacji.
Od 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
[ ... ]