cd .. 在根文件夹上

cd .. 在根文件夹上

为什么cd ..在根文件夹中键入的 不会发出警告或失败并出现错误?

我期望:

/$ cd ..
-bash: cd: ..: No such file or directory

相反,我被留在了/。当然,这是因为..确实存在于/,并且简单地说/,就像.。我只是想知道为什么会这样。

答案1

根据 Open Group(负责 POSIX 标准)的说法:

每个目录只有一个父目录,由名称表示点对点在第一个目录中。 [...] 文件名是什么点对点指相对于根目录是实现定义的。在版本 7 中,它指的是根目录本身;这是 POSIX.1-2008 中提到的行为。在某些网络系统中,构建/../主机名/用于引用另一台主机的根目录,POSIX.1 允许这种行为。

A.4.13 路径名解析

根目录中的点-点条目被解释为表示根目录本身。因此,点-点不能用于访问以根目录为根的子树之外的文件。

chroot - 更改根目录

答案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 /..
/

正如您所看到的,...被指向/

相关内容