为什么符号链接到符号链接不起作用?

为什么符号链接到符号链接不起作用?

在我的 OSX 10.9 机器上使用自制软件安装 SWI-Prolog 时,我遇到了一个奇怪的问题。我正在尝试调试它以找出它是谁的错误(SWI-Prolog 的、自制程序的或 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)
...

但是当我尝试使用符号链接 at 时/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

相关内容