cd .. 如何知道哪个目录是..?

cd .. 如何知道哪个目录是..?

目录包含.和 ,..它们是当前目录和父目录的硬链接。

那么 shell 如何知道(例如在提示符中)当前目录名为“a” cd a/path/..?它有专门的外壳吗?

否则从它的角度来看,它不就是进入了一个名为 的目录..,而不是知道这个目录也是上面的目录吗?它怎么知道名字?

答案1

我假设您的问题是 bash 如何知道更改目录,以便工作目录位于foo(而不是foo/bar/..)中cd foo/bar/..

虽然这两个路径将由相同的 inode 表示(除非路径中存在符号链接,如本答案末尾所示),但 shell 确实需要采取特殊措施将当前目录名称显示为foo,而不是..。在 中bash,当在路径中cd遇到时,它在内部只是将父目录剥离掉,这意味着它永远不能是目录名称。....

这记录在help cd

..通过将紧邻的前一个路径名组件移回到斜杠或 DIR 的开头来进行处理。

这种特殊的大小写会导致以下有趣的行为(请注意,即使真实路径是 ,foo/qux/..仍然解析为):foobar/baz/..

$ tree
.
|-- bar
|   `-- baz
`-- foo

3 directories, 0 files
$ ln -s "$(readlink -f bar/baz)" foo/qux
$ tree
.
|-- bar
|   `-- baz
`-- foo
    `-- qux -> bar/baz

4 directories, 0 files
$ cd foo/qux/..
$ basename "$(pwd)"
foo

答案2

正如您所说,..是到父目录的硬链接。 shell在访问时不需要知道目录的名称..;它只是通过索引节点访问目录。

inode 是一种存储文件(或目录)除文件名之外的所有元数据的结构:类型、权限、所有者、组、大小、访问/更改/修改/删除次数、链接数、属性、ACL 和存储实际文件内容(即数据)的地址。

相关内容