cd .. 在根文件夹上

Bac*_*ach 46 directory cd-command

为什么cd ..在根文件夹中键入,没有警告或失败并出现错误?

我希望:

/$ cd ..
-bash: cd: ..: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

小智 54

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

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

A.4.13 路径名解析

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

chroot - 更改根目录


And*_*ese 29

您不会收到错误消息,因为即使该/目录实际上也具有的有效目录条目..,但与其他目录不同的是,它指向目录本身,因此行为与 相同.

$ 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 /..
$
Run Code Online (Sandbox Code Playgroud)

正如第一列告诉您的那样,.../都具有相同的 inode 编号,因此是相同的文件系统条目。

所以即使你cd ..在你里面/你只是呆在里面/

  • 问题询问*为什么*存在`..`目录条目。 (13认同)
  • 我想到的唯一原因是您想像对待任何其他文件夹一样对待 `/`,包括对 `..` 的有效条目。否则,与系统中的所有其他文件夹相比,您将不得不以不同的方式对待 `/`。 (3认同)

小智 15

它存在是因为删除它需要在内核和 C 库中创建特殊情况处理代码。现在你可以假设在你去的任何目录中总会有一个.and ..

现在唯一需要的特殊情况代码是文件系统挂载代码,其中代码覆盖了..指向包含挂载点的目录的 inode 值,因为根目录并不总是根目录。