web-dev-qa-db-ja.com

シンボリックリンクディレクトリから..に関連するファイル/ディレクトリを一覧表示できないのはなぜですか(そのようなファイルまたはディレクトリはありません)。

/usr/Tomcat6/logsにリンクされた/var/log/Tomcat6ディレクトリがあります。

ディレクトリを/usr/Tomcat6/logsに変更し、相対パス名../conf/Catalina/localhostを使用してlsファイルを試行すると、そのようなファイルまたはディレクトリはありませんエラーが発生します。ただし、cd ../conf/Catalina/localhostは機能します。

以下を参照してください。

[root@Fedora ~]# ll /usr/Tomcat*
lrwxrwxrwx. 1 root root 21 Jun 17 15:00 /usr/Tomcat6 -> Apache-Tomcat-6.0.32/
lrwxrwxrwx. 1 root root 21 Jun 17 13:03 /usr/Tomcat7 -> Apache-Tomcat-7.0.16/
[root@Fedora ~]# cd /usr/Tomcat6
[root@Fedora Tomcat6]# ll logs
lrwxrwxrwx. 1 root root 16 Jun 17 14:51 logs -> /var/log/Tomcat6
[root@Fedora Tomcat6]# cd logs
[root@Fedora logs]# cd ../conf/Catalina/localhost
[root@Fedora localhost]# pwd
/usr/Tomcat6/conf/Catalina/localhost
[root@Fedora localhost]# cd /usr/Tomcat6/logs
[root@Fedora logs]# ll ../conf/Catalina/localhost
ls: cannot access ../conf/Catalina/localhost: No such file or directory

どうしてこれが起こったのでしょうか?シンボリックリンクのバグまたは特別な動作ですか?

3
LiuYan 刘研

これは、bashcdビルトインの特別な動作です。相対的なファイルの動作は自然なものです。シンボリックリンクをたどると、ターゲットの実際のパスに移動し、元のパス情報が失われます。ただし、そこでbashまたはzshcdに使用すると、シェルは元のパスを記憶し、将来の相対的なcdコマンドで使用します。ただし、相対的なファイル名参照ではありません。bashは、ファイル名または他の何かを意図したかどうかを実際には知らないためです。

cdbashドキュメントを見ると、「論理」を使用するかどうかを示す-Lオプションと-Pオプションがあることがわかります(元のパス)または「物理的」(ファイルシステムのアイデアを使用)パス。

常に「論理的」な動作をする必要がある場合は、シンボリックリンクの代わりに--bindマウント(Linuxの場合。Solarisやその他のOSでは「ループバック」などと呼ばれます)を使用する必要があります。

5
geekosaur