Os hardlinks de diretório quebram o sistema de arquivos de várias maneiras
Eles permitem criar loops
Um link físico para um diretório pode ser vinculado a um pai, criando um loop do sistema de arquivos. Por exemplo, esses comandos podem criar um loop com o link de retorno l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
Um sistema de arquivos com um loop de diretório tem profundidade infinita:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Evitar um loop infinito ao atravessar uma estrutura de diretórios é um pouco difícil (embora, por exemplo, o POSIX exija find
isso).
Um sistema de arquivos com esse tipo de link físico não é mais uma árvore, porque uma árvore não deve, por definição, conter um loop.
Eles quebram a ambiguidade dos diretórios pai
Com um loop do sistema de arquivos, existem vários diretórios pai:
cd /tmp/a/b
cd /tmp/a/b/l/b
No primeiro caso, /tmp/a
é o diretório pai de /tmp/a/b
.
No segundo caso, /tmp/a/b/l
é o diretório pai de /tmp/a/b/l/b
, que é o mesmo que /tmp/a/b
.
Portanto, ele tem dois diretórios pai.
Eles multiplicam arquivos
Os arquivos são identificados por caminhos, após a resolução de links simbólicos. assim
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
são arquivos diferentes.
Existem infinitamente muitos outros caminhos do arquivo. Eles são os mesmos em termos de número de inodes, é claro. Mas se você não espera explicitamente loops, não há razão para verificar isso.
Um hardlink de diretório também pode apontar para um diretório filho ou um diretório que não é filho nem pai de nenhuma profundidade. Nesse caso, um arquivo filho do link seria replicado para dois arquivos, identificados por dois caminhos.
Seu exemplo
$ 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
Como os links flexíveis para diretórios funcionam então?
Um caminho que pode conter links flexíveis e até mesmo loops de diretório com links flexíveis geralmente é usado apenas para identificar e abrir um arquivo. Pode ser usado como um caminho linear normal.
Mas há outras situações em que os caminhos são usados para comparar arquivos. Nesse caso, os links simbólicos no caminho podem ser resolvidos primeiro, convertendo-os em uma representação mínima e comumente acordada, criando um caminho canônico :
Isso é possível porque todos os links flexíveis podem ser expandidos para caminhos sem o link. Depois de fazer isso com todos os links flexíveis em um caminho, o caminho restante faz parte de uma árvore, onde um caminho é sempre inequívoco.
O comando readlink
pode resolver um caminho para seu caminho canônico:
$ readlink -f /some/symlinked/path
Links flexíveis são diferentes do que o sistema de arquivos usa
Um link flexível não pode causar todos os problemas porque é diferente dos links dentro do sistema de arquivos. Ele pode ser diferenciado dos links físicos e resolvido para um caminho sem links simbólicos, se necessário.
Em certo sentido, a adição de links simbólicos não altera a estrutura básica do sistema de arquivos - ela mantém, mas adiciona mais estrutura, como uma camada de aplicativo.
De 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
[ ... ]