Um link simbólico armazena o caminho que você dá quando você o cria. Caminhos não funcionam (links simbólicos estão quebrados), quando o arquivo não está realmente nesse caminho. Vamos fazer um symlink com um caminho relativo ...
zanna@toaster:~/playground$ mkdir linkyland anotherplace
zanna@toaster:~/playground$ cd linkyland
zanna@toaster:~/playground/linkyland$ ln -s sauce target
zanna@toaster:~/playground/linkyland$ file *
target: broken symbolic link to sauce
ln
não se importa se o arquivo de origem existe (então se você fizer um erro de digitação no caminho, ele não irá reclamar). Vamos criar o arquivo que queremos vincular e ver se isso ajuda:
zanna@toaster:~/playground/linkyland$ > sauce
zanna@toaster:~/playground/linkyland$ file target
target: symbolic link to sauce
Agora o link funciona. Podemos usar apenas o nome da base (o último elemento do caminho) porque sauce
está no mesmo diretório que target
, então target
pode armazenar o caminho sauce
e isso é informação suficiente para encontrar o sauce
quando precisamos.
zanna@toaster:~/playground/linkyland$ cd ../anotherplace
zanna@toaster:~/playground/anotherplace$ ln -s sauce target
zanna@toaster:~/playground/anotherplace$ file target
target: broken symbolic link to sauce
Esse link simbólico não funciona porque não há sauce
aqui. O caminho sauce
não é informação suficiente. (Deste ponto em diante, eu removi a parte user@host
do meu prompt para facilitar a leitura, mas estou mostrando a parte que indica o diretório de trabalho atual, pois isso mostra como os comandos funcionam.) . Podemos corrigir isso usando um caminho absoluto para fazer o link simbólico:
~/playground/anotherplace$ rm target
~/playground/anotherplace$ ls -s /home/zanna/playground/linkyland/sauce target
~/playground/anotherplace$ file target
target: symbolic link to /home/zanna/playground/linkyland/sauce
No entanto, também podemos corrigi-lo fazendo um caminho relativo correto :
~/playground/anotherplace$ rm target
~/playground/anotherplace$ ln -s ../linkyland/sauce target
~/playground/anotherplace$ file target
target: symbolic link to ../linkyland/sauce
Então a ideia de que precisamos de caminhos absolutos é ... apenas errada. Precisamos de um caminho correto, absoluto ou relativo.
Se os caminhos mudarem, links simbólicos com caminhos absolutos para arquivos na mesma quebra de diretório, mas aqueles com caminhos relativos não:
~/playground/anotherplace$ cd ../linkyland
~/playground/linkyland$ ln -s /home/zanna/playground/linkyland/sauce target2
~/playground/linkyland$ cd ..
~/playground$ mv linkyland elsewhere
~/playground$ file elsewhere/target*
elsewhere/target: symbolic link to sauce
elsewhere/target2: broken symbolic link to /home/zanna/playground/linkyland/sauce
Por isso, geralmente é preferível usar caminhos relativos. No entanto, se a localização do arquivo de origem não for alterada, mas a localização do link simbólico for provável de ser alterada, seria preferível usar um caminho absoluto:
~/playground$ cd anotherplace
~/playground/anotherplace$ ln -s ../elsewhere/sauce target-rel
~/playground/anotherplace$ ln -s /home/zanna/playground/elsewhere/sauce target-abs
~/playground/anotherplace$ cd ..
~/playground$ mv anotherplace ..
~/playground$ cd ..
~$ file anotherplace/*
anotherplace/target-abs: symbolic link to /home/zanna/playground/elsewhere/sauce
anotherplace/target-rel: broken symbolic link to ../elsewhere/sauce