Use um link simbólico para criar um novo link simbólico

1

Eu tenho dois diretórios (FOO, LALA). Eu crio um link simbólico em um deles assim

ln -s /etc/apache2 FOO/apache2

Depois eu quero criar outro symlink, apontando para o mesmo diretório, mas não usando o diretório inicial, mas o symlink criado. Então eu tento

ln -s FOO/apache2 LALA/apache2

O problema é que o segundo link é inválido.

ls FOO/apache2

Os trabalhos acima e lista arquivos em / etc / apache2

ls LALA/apache2

Mas este não. Apenas lista o link em si. Se eu adicionar uma barra no final de cada ls

ls FOO/apache2/

Funciona também.

ls LALA/apache2/

Eu obtenho ls: não consigo acessar o LALA / apache2 /: Nenhum arquivo ou diretório /

Se em vez de

ln -s FOO/apache2 LALA/apache2

eu faço

cd LALA ; ln -s ../FOO/apache2 apache2

Então o link simbólico é válido

Alguma ideia de qual é a diferença?

Pergunta inicial daqui link

    
por George Kastrinis 18.05.2012 / 21:15

1 resposta

1

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.

    
por 18.05.2012 / 21:32