/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
どうしてこれが起こったのでしょうか?シンボリックリンクのバグまたは特別な動作ですか?
これは、bash
のcd
ビルトインの特別な動作です。相対的なファイルの動作は自然なものです。シンボリックリンクをたどると、ターゲットの実際のパスに移動し、元のパス情報が失われます。ただし、そこでbash
またはzsh
をcd
に使用すると、シェルは元のパスを記憶し、将来の相対的なcd
コマンドで使用します。ただし、相対的なファイル名参照ではありません。bash
は、ファイル名または他の何かを意図したかどうかを実際には知らないためです。
cd
のbash
ドキュメントを見ると、「論理」を使用するかどうかを示す-L
オプションと-P
オプションがあることがわかります(元のパス)または「物理的」(ファイルシステムのアイデアを使用)パス。
常に「論理的」な動作をする必要がある場合は、シンボリックリンクの代わりに--bind
マウント(Linuxの場合。Solarisやその他のOSでは「ループバック」などと呼ばれます)を使用する必要があります。