假设我执行以下命令:
$ mkdir -pa/b $ ln -sa/bc $ cd c
那么,在目录c中,为什么ls ..显示目录a的内容,却cd ..返回到原来的目录呢?
shell 区分了两种类型的路径:物理路径,它反映了磁盘上文件夹的实际布局,以及逻辑路径,它考虑了符号链接。当您将工作目录更改为c(而不是a/b)时,shell 知道当前目录的逻辑路径是~/c(假设a在您的主目录中),并且物理路径是~/a/b.
在您的示例中,ls显示的内容是a因为..是 的物理父目录的实际文件系统条目c。另一方面,工作目录是一个 shell 概念,cd是一个 shell 内置命令。shell 知道,虽然c只是 的另一个名称a/b,但具体来说,工作目录c不是a/b. 因此,它是..逻辑解析而不是物理解析。
POSIX 标准指定命令的选项-L和-P选项,cd让您明确说明要遵循的路径。在您的示例中,cd c; cd -P ..应该将您放入~/b而不是~.