我有一个/usr/tomcat6/logs
链接到的目录/var/log/tomcat6
。
当我将目录更改为/usr/tomcat6/logs
并尝试ls
使用相对路径名访问文件时../conf/Catalina/localhost
,没有这样的文件或目录发生错误。然而,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
怎么会发生这样的事?这是符号链接的错误还是特殊行为?
答案1
这是内置函数的特殊bash
行为cd
;相对文件行为是自然的行为。一旦你点击了符号链接,你就进入了目标的实际路径,原始路径信息就会丢失;但如果您使用bash
或zsh
到cd
那里,那么 shell 会记住原始路径并在以后的相关cd
命令中使用它。但不在相对文件名引用中,因为bash
实际上不知道您是否想要文件名或其他内容。
如果您查看cd
中的文档bash
,您将看到有-L
和-P
选项告诉它是使用“逻辑”(记住原始路径)还是“物理”(使用文件系统的想法)路径。
如果您需要始终具有“逻辑”行为,则需要使用挂载--bind
(在 Linux 上;Solaris 和其他操作系统将其称为“环回”或其他名称)而不是符号链接。