シンボリックリンクへのシンボリックリンクが機能しないのはなぜですか?

シンボリックリンクへのシンボリックリンクが機能しないのはなぜですか?

私の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つのファイルがあり、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

関連情報