假设我执行以下命令:
$ 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
而不是~
.