为什么无法从符号链接目录中列出相对于 .. 的文件/目录(没有这样的文件或目录)?

为什么无法从符号链接目录中列出相对于 .. 的文件/目录(没有这样的文件或目录)?

我有一个/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;相对文件行为是自然的行为。一旦你点击了符号链接,你就进入了目标的实际路径,原始路径信息就会丢失;但如果您使用bashzshcd那里,那么 shell 会记住原始路径并在以后的相关cd命令中使用它。但不在相对文件名引用中,因为bash实际上不知道您是否想要文件名或其他内容。

如果您查看cd中的文档bash,您将看到有-L-P选项告诉它是使用“逻辑”(记住原始路径)还是“物理”(使用文件系统的想法)路径。

如果您需要始终具有“逻辑”行为,则需要使用挂载--bind(在 Linux 上;Solaris 和其他操作系统将其称为“环回”或其他名称)而不是符号链接。

相关内容