심볼릭 링크에 대한 심볼릭 링크가 작동하지 않는 이유는 무엇입니까?

심볼릭 링크에 대한 심볼릭 링크가 작동하지 않는 이유는 무엇입니까?

내 OSX 10.9 컴퓨터에서 homebrew를 사용하여 SWI-Prolog를 설치할 때 이상한 문제가 발생했습니다. 나는 적절하게 보고하고 수정할 수 있도록 이 버그가 누구의 버그(SWI-Prolog, Homebrew 또는 OSX)인지 알아내기 위해 디버깅하려고 합니다.

내 경로의 어떤 심볼릭 링크가 어떤 심볼릭 링크 로 swipl이동합니까 ?/usr/local/bin/swipl/usr/local/Cellar/swi-prolog/6.2.3/bin/swipl/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

실제 실행 파일을 다음에서 실행할 수 있습니다 /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)
...

심볼릭 링크를 사용할 수 있습니다 /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)
...

/usr/local/bin/swipl그러나 다른 심볼릭 링크에 대한 심볼릭 링크인 심볼릭 링크를 사용하려고 하면 오류가 발생합니다.

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

나만의 심볼릭 링크를 만들 수도 있으며 /usr/local/Cellar/swi-prolog/6.2.3/lib/swipl-6.2.3/bin/x86_64-darwin13.0.0/swipl작동합니다.

% 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)
...

에 대한 자체 심볼릭 링크가 있지만 /usr/local/Cellar/swi-prolog/6.2.3/bin/swipl실패합니다.

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

그래서 나는 무엇이 잘못되었는지 모릅니다. 파일에 대한 심볼릭 링크는 작동하지만 파일에 대한 심볼릭 링크는 실패하는 이유는 무엇입니까?

답변1

몇 가지 예를 만들어 보세요. 시스템은 CD와 같은 심볼릭 링크 연결을 지원합니다.

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

실험을 시작하세요:

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

myls3이 작동하면 시스템은 연결된 기호 링크를 지원합니다. 나는 그렇지 않을 것이라고 믿지 않습니다 :) 그러면 문제는 심볼릭 링크가 아니라 SWI-Prolog에 있다고 생각합니다. 내 생각엔 그가 자신의 물리적 위치를 알고 싶어하기 때문에 심볼릭 링크를 해결하려고 하는 것 같아요. 일반적으로 기본 라이브러리 및 기타 항목을 찾는 데 필요합니다. 내 생각에는 이것이 SWI-Prolog의 버그인 것 같습니다. 상위 버전에서는 수정될 수 있습니다. 아마도 이 버그를 보고해야 할 것 같습니다. 어쩌면 사용 가능한 수정 사항이 있을 수도 있습니다.

답변2

나는 이것이 버전이나 링크와 관련이 없다고 생각합니다. 어쩌면 실행 중인 스크립트가 심볼릭 링크를 통해 호출될 때 여러 수준의 간접 호출을 처리할 수 없을 수도 있습니다.

파일에 대한 링크를 연결하는 이와 같은 설정이 있다고 가정해 보겠습니다.

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

이렇게 하면 하나의 파일이 있고 1/2/3/4/afile위의 모든 내용은 afile일련의 상호 링크로 구성되어 궁극적으로 단일 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

위의 링크 중 하나에서 언제든지 파일에 액세스할 수 있습니다. 예를 들면 다음과 같습니다.

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

readlink링크가 가리키는 표준 경로를 알아내는 데 사용할 수 있는 방법은 다음과 같습니다.

$ readlink -f afile 
/home/saml/tst/97990/1/2/3/4/afile

관련 정보