斜线 (/) 是 Linux 根目录名称的一部分吗?

mli*_*bre 48 linux filesystems fhs filenames

斜线 ( /) 真的是 Linux 根目录名称的一部分吗?或者它只是它的象征?

怎么样/etc等等?

更新

假设/dev/sda2是一个Linux根目录的块设备。

$ sudo debugfs /dev/sda2
debugfs 1.44.1(2018 年 3 月 24 日)
调试文件:  密码
[密码] INODE:2 路径:/
[root] 节点:2 路径:/
调试文件:  统计/    索引节点
:2   类型:目录模式:0755 标志:0x80000
代:0 版本:0x00000000:00000077
用户:0 组:0 项目:0 大小:4096
文件 ACL:0
链接:25 块数:8
片段:地址:0 数量:0 大小:0
 ctime: 0x5b13c9f1:3f017990 -- Sun Jun 3 15:28:57 2018
 atime: 0x5b13ca0f:3b3ee380 -- Sun Jun 3 15:29:27 2018
 mtime: 0x5b13c9f1:3f017990 -- Sun Jun 3 15:28:57 2018
crtime: 0x5aad1843:00000000 -- 2018 年 3 月 17 日星期六 16:59:39
额外 inode 字段的大小:32
范围:
(0):9249

所以那里有一个目录,inode #2,但它没有名字。

Kus*_*nda 65

POSIX.1-2008 标准说

由单个路径名组成的路径名/应解析为进程的根目录。不应成功解析空路径名。

该标准进一步区分了文件名路径名/是根目录的路径名。目录的名称是“根目录”,但在文件系统中它是无名的,它没有文件名。如果它有文件名,则该名称将是根目录上方目录中的目录条目,并且没有这样的目录。

该字符/永远不能成为文件名的一部分,因为它是路径分隔符。

为清楚起见:/不是根目录的名称,而是它的路径,它的pathname

/etc是另一个路径名。它是etc目录的绝对路径。该路径上的目录名称是etc(其文件名是etc)。

/usr/local/bin/curlcurl可执行文件/etc的路径名,与etc目录的路径名相同。


Tho*_*key 37

斜线是一个分隔符;目录不包含分隔符,但完整路径名包含分隔符。

所以“根级别” /没有name。在大多数类 Unix 系统上,这被视为一种特殊情况,如.and ..(当然,在根级别两者之间没有区别)。

命名法可以不同。例如,POSIX.1-2017 列出了一些常用的定义

  • 3.2 绝对路径名

    以单个或两个以上<slash>字符开头的路径名;另见路径名

  • 3.271 路径名

    用于标识文件的字符串。在 POSIX.1-2008 的上下文中,路径名可能被限制为 {PATH_MAX} 字节,包括终止空字节。它有可选的开始<slash>字符,后跟零个或多个由<slash>字符分隔的文件名。路径名可以选择包含一个或多个尾随<slash>字符。多个连续<slash>字符被认为与 1 相同<slash>,除了正好有两个前导<slash>字符的情况。

    注意:如果路径名仅包含与可移植文件名字符集(请参阅可移植文件名字符集)中的<slash>字符对应的字节、字符和单个终止符<NUL>字符,路径名将在所有支持的语言环境中用作字符串;否则,路径名可能只是一个字符串(而不是字符串)。此外,由于<slash>字符的单字节编码要求在所有语言环境中都相同,并且不能出现在多字节字符中,因此<slash>即使路径名不是字符,对路径名中的字符的引用也是明确定义的细绳。但是,此属性不一定适用于可移植文件名字符集中的其余字符。

  • 3.272 路径名组件

    请参阅文件名中的文件名

  • 3.170 文件名

    由 1 到{NAME_MAX}用于命名文件的字节组成的字节序列。组成名称的字节不应包含<NUL><slash>字符。在路径名的上下文中,每个文件名应后跟一个<slash>或一个<NUL>字符;在其他地方,文件名后跟一个<NUL>字符形成一个字符串(但不一定是字符串)。文件名dot-dot具有特殊含义。文件名有时称为“路径名组件”。另见路径名

所以......如果你正在寻找澄清,那可能不是你的第一站。诸如此UNIX 概念页面之类的教程很有帮助,例如,指出“完整路径名”与“绝对”路径名是同义词。

  • Nitpick:dot 和 dot-dot 是文件名,而不是路径名。实际上,POSIX 标准有一个奇怪的表述“作为一种特殊情况,在根目录中,点-点*可能*指的是根目录本身。” (我的重点)。 (4认同)

Jör*_*tag 19

在 Unix 中,文件(和目录只是文件)没有“名称”。链接有名称,链接是目录中将名称映射到文件的条目。

可能会说,那链接的文件名,但要注意:这意味着一个文件可以有多个名字,因为它可以有多个链接。

由于根目录是根目录,因此没有“上级”目录可以链接到它,因此不能有与之关联的名称。理论上可以在其他目录中添加指向根目录的链接,但大多数 Unices 禁止添加指向现有目录的链接,因为这可能导致文件系统层次结构(实际上是有向图)中的循环,并检测循环在图形中是昂贵的,但在尝试解析内核中的名称时,不检测它们会导致无限递归。

所以,基本上,根目录没有名字,因为在它上面没有我们可以记录名字的目录。

正如其他答案中指出的那样,我们需要区分名称和路径(名称)。可以通过 path(name) 引用根目录/


Ste*_*ris 7

“名字”这个词的使用有点灵活;它可以引用“完全限定的路径名​​”;它可以指“目录条目”;它可以指传递给各种函数或例程的“文件名”。

所以,例如,/etc/fooand 和/var/tmp/../../etc/fooand/tmp/../../../../../../foo都是引用同一个文件的方式;它们都是有效名称,就像foo/etc目录中一样。

所以让我们回到基础。

unix 中的文件名由目录分隔符分隔的组件组成/。几乎对组件的唯一限制是它们不能包含/或 NUL 字符;其他任何事情都是允许的。

所以“完全限定路径名”/etc是完整的字符串:/etc。这意味着它etc在根目录中有组件。

同样,目录中/x/y/z/foo也会有foo组件/x/y/z

现在根目录是唯一的,因为它在父目录中没有组件;它只有完整的路径名作为其名称:/.