斜杠 ( /
) 真的是 Linux 根目录名称的一部分吗?或者它只是它的一个象征?
等等/etc
又怎样呢?
更新
假设/dev/sda2
是Linux根目录的块设备。
$sudo debugfs /dev/sda2 debugfs 1.44.1(2018 年 3 月 24 日) 调试: 密码 [pwd] INODE: 2 路径: / [根] INODE:2 路径:/ 调试: 统计/ 索引节点:2 类型:目录 模式:0755 标志:0x80000 代:0 版本:0x00000000:00000077 用户:0 组:0 项目:0 大小:4096 文件访问控制列表:0 链接:25 块数:8 片段: 地址:0 数量:0 大小:0 ctime: 0x5b13c9f1:3f017990 -- 2018 年 6 月 3 日星期日 15:28:57 atime: 0x5b13ca0f:3b3ee380 -- 2018 年 6 月 3 日星期日 15:29:27 时间: 0x5b13c9f1:3f017990 -- 2018 年 6 月 3 日星期日 15:28:57 crtime: 0x5aad1843:00000000 -- 2018 年 3 月 17 日星期六 16:59:39 额外 inode 字段的大小:32 范围: (0):9249
所以那里有一个目录,inode #2,但它没有名称。
答案1
POSIX.1-2008 标准表示
由单个组成的路径名
/
应解析为进程的根目录。空路径名将无法成功解析。
该标准进一步区分了文件名和路径名。/
是根目录的路径名。该目录的名称是“根目录”,但在文件系统中它是无名的,它没有文件名。如果它有一个文件名,那么该名称将是根目录上方目录中的一个目录条目,并且没有这样的目录。
该字符/
永远不能成为文件名的一部分,因为它是路径分隔符。
为了清楚起见:/
不是姓名的根目录,但是小路对它,它的路径名。
/etc
是另一个路径名。它是目录的绝对路径etc
。该路径的目录名称是etc
(其文件名是etc
)。
/usr/local/bin/curl
是可执行文件的路径名,与目录的路径名curl
相同。/etc
etc
答案2
斜线是一个分隔器;目录名字不包括分隔符,但是完整路径名包括分隔符。
所以“根级” /
没有姓名。在大多数类 Unix 系统上,这被视为特殊情况,例如.
和..
(当然,两者在根级别上没有区别)。
命名法可能有所不同。以 POSIX.1-2017 为例,列出了一些常用的定义:
-
以单个或两个以上
<slash>
字符开头的路径名;也可以看看路径名。 -
用于标识文件的字符串。在 POSIX.1-2008 的上下文中,路径名可能限制为 {PATH_MAX} 字节,包括终止空字节。它具有可选的起始
<slash>
字符,后跟零个或多个由<slash>
字符分隔的文件名。路径名可以选择包含一个或多个尾随<slash>
字符。多个连续<slash>
字符被视为与 1 相同<slash>
,但恰好有两个前导字符的情况除外<slash>
。
注意:如果路径名仅包含与可移植文件名字符集中的字符相对应的字节(请参阅可移植文件名字符集)、<slash>
字符和单个终止<NUL>
字符,路径名将在所有受支持的语言环境中用作字符串;否则,路径名可能只是一个字符串(而不是字符串)。此外,由于字符的单字节编码<slash>
要求在所有语言环境中都相同,并且不能出现在多字节字符内,因此<slash>
即使路径名不是字符,对路径名中的字符的引用也是明确定义的细绳。但是,此属性不一定适用于可移植文件名字符集中的其余字符。 -
参见文件名文件名。
-
由 1 到 字节组成的字节序列,
{NAME_MAX}
用于命名文件。组成名称的字节不得包含<NUL>
或<slash>
字符。在路径名的上下文中,每个文件名后应跟一个<slash>
或 一个<NUL>
字符;在其他地方,文件名后跟一个<NUL>
字符形成一个字符串(但不一定是字符串)。文件名点和dot-dot
有特殊意义。文件名有时被称为“路径名组件”。也可以看看路径名。
所以...如果您正在寻找澄清,那可能不是您的第一站。类似这样的教程UNIX 概念页面很有帮助,例如,指出“完整路径名”与“绝对”路径名同义。
答案3
在 Unix 中,文件(目录只是文件)没有“名称”。链接有名称,链接是将名称映射到文件的目录中的条目。
你可能说,链接给文件的名称,但请注意:这意味着一个文件可以有多个名称,因为它可以有多个链接。
由于根目录就是根目录,因此不存在可以链接到它的“更高层”目录,因此不能有与其关联的名称。理论上可以在其他目录中添加到根目录的链接,但是大多数Unice禁止添加到现有目录的链接,因为这可能会导致文件系统层次结构(实际上是有向图)中出现循环,并且检测循环在图中是昂贵的,但在尝试解析内核中的名称时不检测它们可能会导致无限递归。
所以,基本上,根目录没有名称,因为它上面没有可以记录名称的目录。
正如其他答案中指出的那样,我们需要区分名称和路径(名称)。根目录能通过 path(name) 引用/
。
答案4
“名字”这个词的使用有点灵活;它可以引用“完全限定路径名”;它可以指“目录条目”;它可以指传递给各种函数或例程的“文件名”。
例如,/etc/foo
and/var/tmp/../../etc/foo
和/tmp/../../../../../../foo
都是引用同一文件的方式;它们都是有效的名字,与在目录foo
中时一样/etc
。
那么让我们回到基础知识。
unix 中的文件名由以下部分组成成分由目录分隔符分隔/
。对组件的唯一限制几乎是它们不能包含 the/
或 NUL 字符;其他任何事情都是允许的。
因此,“完全限定路径名”/etc
是完整的字符串:/etc
。这意味着它的etc
根目录中有该组件。
同样,/x/y/z/foo
该组件也会foo
在目录中/x/y/z
。
现在根目录是唯一的,因为它在父目录中没有任何组件;它仅有的具有完整路径名作为其名称:/
。