目录包含.
和 ,..
它们是当前目录和父目录的硬链接。
那么 shell 如何知道(例如在提示符中)当前目录名为“a” cd a/path/..
?它有专门的外壳吗?
否则从它的角度来看,它不就是进入了一个名为 的目录..
,而不是知道这个目录也是上面的目录吗?它怎么知道名字?
答案1
我假设您的问题是 bash 如何知道更改目录,以便工作目录位于foo
(而不是foo/bar/..
)中cd foo/bar/..
。
虽然这两个路径将由相同的 inode 表示(除非路径中存在符号链接,如本答案末尾所示),但 shell 确实需要采取特殊措施将当前目录名称显示为foo
,而不是..
。在 中bash
,当在路径中cd
遇到时,它在内部只是将父目录剥离掉,这意味着它永远不能是目录名称。..
..
这记录在help cd
:
..
通过将紧邻的前一个路径名组件移回到斜杠或 DIR 的开头来进行处理。
这种特殊的大小写会导致以下有趣的行为(请注意,即使真实路径是 ,foo/qux/..
仍然解析为):foo
bar/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 和存储实际文件内容(即数据)的地址。