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 允许这种行为。
根目录中的点-点条目被解释为表示根目录本身。因此,点点不能用于访问以根目录为根的子树之外的文件。
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 ..
在你里面/
你只是呆在里面/
。
小智 15
它存在是因为删除它需要在内核和 C 库中创建特殊情况处理代码。现在你可以假设在你去的任何目录中总会有一个.
and ..
。
现在唯一需要的特殊情况代码是文件系统挂载代码,其中代码覆盖了..
指向包含挂载点的目录的 inode 值,因为根目录并不总是根目录。