为什么cd ..
在根文件夹中键入的 不会发出警告或失败并出现错误?
我期望:
/$ cd ..
-bash: cd: ..: No such file or directory
相反,我被留在了/
。当然,这是因为..
确实存在于/
,并且简单地说/
,就像.
。我只是想知道为什么会这样。
答案1
根据 Open Group(负责 POSIX 标准)的说法:
每个目录只有一个父目录,由名称表示点对点在第一个目录中。 [...] 文件名是什么点对点指相对于根目录是实现定义的。在版本 7 中,它指的是根目录本身;这是 POSIX.1-2008 中提到的行为。在某些网络系统中,构建/../主机名/用于引用另一台主机的根目录,POSIX.1 允许这种行为。
根目录中的点-点条目被解释为表示根目录本身。因此,点-点不能用于访问以根目录为根的子树之外的文件。
答案2
您不会收到错误,因为即使是/
目录实际上有的有效目录条目..
,但与其他目录不同,它指向目录本身,因此行为与 相同.
:
$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$
正如第一列告诉您的那样,.
、..
和/
都具有相同的索引节点号,因此是相同的文件系统条目。
所以即使你cd ..
内心深处,/
你也只是呆在里面/
。
答案3
它之所以存在,是因为删除它需要在内核和 C 库中创建特殊情况处理代码。现在您可以假设在您访问的任何目录中总会有一个.
and 。..
现在需要的唯一特殊情况代码是文件系统安装代码,其中代码覆盖 inode 值以..
指向包含安装点的目录,因为根目录并不总是根目录。
答案4
检查.
and ..
in 的另一种方法/
是:
$ readlink -f ..
/home
$ readlink -f /.
/
$ readlink -f /..
/
正如您所看到的,.
和..
被指向/
。