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.