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

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

斜杠 ( /) 真的是 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相同。/etcetc

答案2

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

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

命名法可能有所不同。以 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 概念页面很有帮助,例如,指出“完整路径名”与“绝对”路径名同义。

答案3

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

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

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

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

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

答案4

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

例如,/etc/fooand/var/tmp/../../etc/foo/tmp/../../../../../../foo都是引用同一文件的方式;它们都是有效的名字,与在目录foo中时一样/etc

那么让我们回到基础知识。

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

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

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

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

相关内容