Por que um link simbólico para um symlink não funciona?

6

Eu me deparei com um problema estranho ao instalar o SWI-Prolog usando homebrew na minha caixa OSX 10.9. Eu estou tentando depurá-lo para descobrir quem é o bug (SWI-Prolog, homebrew ou OSX), para que eu possa relatá-lo adequadamente e consertá-lo.

O swipl no meu caminho é /usr/local/bin/swipl , que é um link simbólico para /usr/local/Cellar/swi-prolog/6.2.3/bin/swipl qual links simbólicos para /usr/local/Cellar/swi-prolog/6.2.3/lib/swipl-6.2.3/bin/x86_64-darwin13.0.0/swipl .

% which swipl
/usr/local/bin/swipl
% find /usr/local -name swipl -exec ls -l {} \;
lrwxr-xr-x  1 rampion  admin  36 Oct 23 20:54 /usr/local/bin/swipl -> ../Cellar/swi-prolog/6.2.3/bin/swipl
lrwxr-xr-x  1 rampion  admin  48 Oct 23 20:54 /usr/local/Cellar/swi-prolog/6.2.3/bin/swipl -> ../lib/swipl-6.2.3/bin/x86_64-darwin13.0.0/swipl
-r-xr-xr-x  1 rampion  admin  8760 Oct 23 20:54 /usr/local/Cellar/swi-prolog/6.2.3/lib/swipl-6.2.3/bin/x86_64-darwin13.0.0/swipl

Eu posso executar o executável real em /usr/local/Cellar/swi-prolog/6.2.3/lib/swipl-6.2.3/bin/x86_64-darwin13.0.0/swipl :

% /usr/local/Cellar/swi-prolog/6.2.3/lib/swipl-6.2.3/bin/x86_64-darwin13.0.0/swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.2.3)
...

E eu posso usar o link simbólico em /usr/local/Cellar/swi-prolog/6.2.3/bin/swipl :

% /usr/local/Cellar/swi-prolog/6.2.3/bin/swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.2.3)
...

Mas quando eu tento usar o link simbólico em /usr/local/bin/swipl , que apenas links simbólicos para o outro symlink, recebo um erro:

% /usr/local/bin/swipl
Abort trap: 6
% echo $?
134

Também posso criar meus próprios links simbólicos para /usr/local/Cellar/swi-prolog/6.2.3/lib/swipl-6.2.3/bin/x86_64-darwin13.0.0/swipl e eles funcionam:

% ln -s /usr/local/Cellar/swi-prolog/6.2.3/lib/swipl-6.2.3/bin/x86_64-darwin13.0.0/swipl swipl.0
% ./swipl.0 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.2.3)
...

E meus próprios links simbólicos para /usr/local/Cellar/swi-prolog/6.2.3/bin/swipl , e eles falham:

% ln -s /usr/local/Cellar/swi-prolog/6.2.3/bin/swipl swipl.1
% ./swipl.1
Abort trap: 6
% echo $?
134

Então eu não tenho idéia do que está errado. Por que um link simbólico para um arquivo funcionaria, mas um link simbólico para um symlink para um arquivo falha?

    
por rampion 29.10.2013 / 01:55

2 respostas

1

tente fazer algum exemplo, seu sistema suporta links simbólicos encadeados, por exemplo cd

ln -s /bin/ls myls1
ln -s myls1 myls2
ln -s myls2 myls3

iniciar experimento:

./myls1 should work
./myls2 works or not?
./myls3 works or not?

Quando o myls3 funciona, seu sistema suporta links simbólicos encadeados. Eu não acredito que não faz :) Então eu acho que o problema não é com links simbólicos, mas com o SWI-Prolog. Eu acho que está tentando resolver links simbólicos porque ele quer saber sua localização física. Geralmente é necessário para encontrar bibliotecas padrão e outros bens. Na minha opinião, isso pode ser um bug no SWI-Prolog. Talvez seja reparado em versão superior. Talvez você deva relatar este bug. Talvez alguma correção esteja disponível.

    
por 06.08.2014 / 12:32
0

Eu não tenho nada a ver com versões, nem um problema com os links, é provavelmente que o script que está rodando não suporta ser chamado de vários níveis de indireção quando chamado via symlinks.

Exemplo

Digamos que eu tenha uma configuração como essa de links para links para um arquivo.

$ tree
.
|-- 1
|   |-- 2
|   |   |-- 3
|   |   |   |-- 4
|   |   |   |   '-- afile
|   |   |   '-- afile -> 4/afile
|   |   '-- afile -> 3/afile
|   '-- afile -> 2/afile
'-- afile -> 1/afile

Para que haja um único arquivo, 1/2/3/4/afile e todos os afile acima são uma cadeia de links entre si, o que acaba levando ao único arquivo afile .

$ find . -ls
10890091    4 drwxrwxr-x   3 saml     saml         4096 Oct 28 22:03 .
10890244    0 lrwxrwxrwx   1 saml     saml            7 Oct 28 22:03 ./afile -> 1/afile
10890107    4 drwxrwxr-x   3 saml     saml         4096 Oct 28 22:02 ./1
10890247    0 lrwxrwxrwx   1 saml     saml            7 Oct 28 22:02 ./1/afile -> 2/afile
10890121    4 drwxrwxr-x   3 saml     saml         4096 Oct 28 22:02 ./1/2
10890246    0 lrwxrwxrwx   1 saml     saml            7 Oct 28 22:02 ./1/2/afile -> 3/afile
10890136    4 drwxrwxr-x   3 saml     saml         4096 Oct 28 22:02 ./1/2/3
10890245    0 lrwxrwxrwx   1 saml     saml            7 Oct 28 22:02 ./1/2/3/afile -> 4/afile
10890137    4 drwxrwxr-x   2 saml     saml         4096 Oct 28 22:06 ./1/2/3/4
10890243    4 -rw-rw-r--   1 saml     saml            5 Oct 28 22:06 ./1/2/3/4/afile

Eu sempre posso acessar o arquivo de qualquer um dos links acima dele, por exemplo:

$ pwd
/home/saml/tst/97990/1
$ cat afile 
blah

Eu posso usar readlink para descobrir o caminho canônico para o qual os links apontam:

$ readlink -f afile 
/home/saml/tst/97990/1/2/3/4/afile
    
por 29.10.2013 / 03:08