I collegamenti hard della directory rompono il filesystem in diversi modi
Ti consentono di creare loop
Un collegamento reale a una directory può essere collegato a un genitore di se stesso, che crea un loop del file system. Ad esempio, questi comandi potrebbero creare un ciclo con il collegamento a ritroso l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
Un filesystem con un ciclo di directory ha una profondità infinita:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Evitare un ciclo infinito quando si attraversa una tale struttura di directory è alquanto difficile (anche se ad esempio POSIX richiede find
di evitarlo).
Un file system con questo tipo di hard link non è più un albero, perché un albero non deve, per definizione, contenere un ciclo.
Rompono l'ambiguità delle directory dei genitori
Con un loop di filesystem, esistono più directory padre:
cd /tmp/a/b
cd /tmp/a/b/l/b
Nel primo caso, /tmp/a
è la directory principale di /tmp/a/b
.
Nel secondo caso, /tmp/a/b/l
è la directory principale di /tmp/a/b/l/b
, che è la stessa di /tmp/a/b
.
Quindi ha due directory principali.
Moltiplicano i file
I file sono identificati da percorsi, dopo aver risolto i collegamenti simbolici. Così
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
sono file diversi.
Ci sono infiniti altri percorsi del file. Sono gli stessi in termini di numero di inode ovviamente. Ma se non ti aspetti esplicitamente i loop, non c'è motivo di verificarlo.
Un hardlink di directory può anche puntare a una directory figlio, o una directory che non è né figlio né genitore di alcuna profondità. In questo caso, un file che è figlio del collegamento verrebbe replicato in due file, identificati da due percorsi.
Il tuo esempio
$ 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
Come possono funzionare i collegamenti soft alle directory?
Un percorso che può contenere softlink e persino loop di directory soft link viene spesso utilizzato solo per identificare e aprire un file. Può essere usato come un normale percorso lineare.
Ma ci sono altre situazioni, quando i percorsi vengono utilizzati per confrontare i file. In questo caso, i collegamenti simbolici nel percorso possono essere risolti per primi, convertendoli in una rappresentazione minima e comunemente concordata creando un percorso canonico :
Questo è possibile, poiché tutti i collegamenti software possono essere espansi in percorsi senza il collegamento. Dopo averlo fatto con tutti i collegamenti soft in un percorso, il percorso rimanente fa parte di un albero, in cui un percorso è sempre inequivocabile.
Il comando readlink
può risolvere un percorso nel suo percorso canonico:
$ readlink -f /some/symlinked/path
I collegamenti software sono diversi da quelli utilizzati dal filesystem
Un collegamento software non può causare tutti i problemi perché è diverso dai collegamenti all'interno del file system. Può essere distinto dai collegamenti reali e risolto in un percorso senza collegamenti simbolici, se necessario.
In un certo senso, l'aggiunta di collegamenti simbolici non altera la struttura di base del file system: lo mantiene, ma aggiunge più struttura come un livello applicazione.
Da 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
[ ... ]