Há duas coisas para lembrar:
-
ln -s
(sem-r
) armazena o nome de destino literalmente ao passá-lo para ele - se você passar um destino relativo, ele resolve relativamente ao nome do link , não ao seu diretório de trabalho atual
Exemplo:
Eu estou em /home/user/d0
e quero um link para /home/user/file
, então eu faço:
ln -s ../file .
../file
é um caminho válido de d0
.
Agora, se houver um subdiretório d1
( /home/user/d0/d1
) e eu quiser colocar um link para ../file
( /home/user/file
) lá sem alterar dirs, preciso fazer:
ln -s ../../file d1/
porque o caminho relativo precisa ser relativo ao nome do link , não ao meu diretório de trabalho atual. ../../file
(provavelmente) resolve nada em relação a d0
(a menos que haja um arquivo chamado /home/file
), portanto, não receberei autocompletion para ele, o que pode tornar a operação mais propensa a erros.
Por isso, mudo para d1
primeiro:
cd d1
ln -s ../../file .
e agora ../../file
faz sentido em relação ao diretório atual e ao nome do link; o preenchimento automático entra em ação, e eu recebo minha garantia de que tenho o nome certo.
O GNU ln
possui um --relative|-r
flag, o que torna isso mais fácil, evitando que você tenha que compor esses caminhos relativos manualmente. Com ele, você pode usar um caminho relativo ao diretório atual ou a um caminho absoluto e relativá-lo em relação ao nome do link (como ele precisa ser).