Liu*_* 刘研 3 ls directory cd-command symlink
我有一个/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
Run Code Online (Sandbox Code Playgroud)
这怎么会发生?这是符号链接的错误还是特殊行为?
这是bash'scd内置函数的特殊行为;相对文件行为是自然的。一旦你跟随一个符号链接,你就在目标的实际路径中,原始路径信息丢失了;但是,如果您使用bash或zsh到cd那里,则外壳会记住原始路径并在以后的相关cd命令中使用它。但不是在相对文件名引用中,因为bash实际上并不知道您是否打算使用文件名或其他内容。
如果你看一下cd在文档中bash,你会看到有-L和-P选项,这些选项告诉它是否使用“逻辑”(记住原来的路径)或“物理”(用文件系统的想法)的路径。
如果您需要始终具有“逻辑”行为,则需要使用--bind挂载(在 Linux 上;Solaris 和其他操作系统将其称为“环回”或其他东西)而不是符号链接。