A diferença é que os links simbólicos relativos são resolvidos no tempo de acesso , não no tempo de criação.
No seu primeiro exemplo, se o nome do link for /somedir/LALA/apache2
e seu destino for FOO/apache2
, ele será resolvido como /somedir/LALA/FOO/apache2
ao acessá-lo.
link name: link target: absolute target: "/somedir/LALA/apache2" + "FOO/apache2" = "/somedir/LALA/FOO/apache2"
No segundo exemplo, o nome do link é o mesmo - /somedir/LALA/apache2
- mas seu destino, ../FOO/apache2
, agora é resolvido como:
link name: link target: absolute target: "/somedir/LALA/apache2" + "../FOO/apache2" = "/somedir/LALA/../FOO/apache2" → "/somedir/FOO/apache2"
Isso significa que você sempre deve fornecer " ../FOO/apache2
" como o destino para ln -s
ao criar o segundo link, independentemente de qual diretório você está atualmente .
Nota: Na versão mais recente do coreutils , o comando ln
tem uma nova opção -r
/ --relative
, que faz o trabalho para você. Por exemplo, ln -r -s FOO/apache2 LALA/apache2
funcionaria corretamente.
Para versões mais antigas, você pode hackear algo com realpath --strip --relative-to
...
Eu escrevi sym
para meu próprio uso.