为什么根目录用 / 符号表示?

Rub*_*vvy 96 linux history directory-structure

我在谷歌上做了一些关于这个的研究,但结果是多云的。为什么用这个/符号来表示根目录。这背后有什么可靠的原因吗?

Tho*_*man 110

正斜杠/是分隔类 Unix 操作系统中路径中的目录的分隔符。这个字符似乎是在 1970 年代的某个时候选择的,据传闻,原因可能与 Unix 的前身Multics操作系统使用该>字符作为路径分隔符有关,但 Unix 的设计者已经保留了在它们拥有多级文件系统之前,字符><在 shell 命令行上表示 I/O 重定向。因此,当设计文件系统时,他们必须找到另一个字符来表示路径名元素分离。

这里需要注意的一点是,在 1970 年代常用的 Lear-Siegler ADM-3A 终端中,其中使用~字符表示主目录的做法起源于其中/key 就在key 旁边>

Lear-Siegler ADM-3A 终端的键盘布局

至于为什么根目录用单个 表示/,这是一个约定,最有可能受到以下事实的影响:根目录是目录层次结构的顶级目录,而其他目录可能在其下方,但通常没有'没有理由引用根目录之外的任何内容。同样,目录条目本身也没有名称,因为它是可见目录树的边界。

  • 还有 `chroot` 之类的 - 你不能*访问*新根目录之外的任何东西,但这并不意味着它们不存在。 (4认同)
  • IIRC,Multics 约定不仅使用 `&gt;` 作为目录分隔符,还使用 ​​`&lt;` 来引用父目录:`&lt;` 本身等同于 `..`,而 `&lt;foo` 等同于 ` ../foo`. 我总是觉得这在美学上令人愉悦。 (4认同)
  • “虽然其他目录可能在它下面,但通常没有理由引用根目录之外的任何内容。” 我不明白这个。我不确定您所说的“下方”是指哪个方向,但是在 `/` 处安装的层次结构“外部”没有任何东西。Unix 文件系统是一个单一的树,具有各种驱动器的挂载点。 (2认同)

Gil*_*il' 59

我们今天所知的第一个分层文件系统是为Multics设计的。该设计在RC Daley 和 PG Neumann 的“A General-Purpose File System For Secondary Storage”中有所描述。该文件系统的一个显着特征是目录是一个文件,它可以像任何其他文件一样包含在目录中。文件结构形成一棵树,其中所有非叶节点都是目录。树的根总是一个目录。每个文件都有一个名称(条目名称),该名称在其父目录中是唯一的。根目录没有名称,因为它不包含在另一个目录中。

为了指定文件,您需要描述从树的根开始的路径。Multics 采用了一种自然的路径名语法,其中 ifP是目录的路径,F是文件的名称,则是在路径为.P>FFP

对于那些不想让目录给自己带来负担的时候,Multics 有一个工作目录的概念。没有目录指示的裸文件名被解释为工作目录中的文件。

结合这些规则,foo就是工作目录下的一个文件;foo>barfoo工作目录子目录下的文件,依此类推。这些规则描述了相对路径,但需要一个补充规则来构建从根目录开始的绝对路径。鉴于从左到右读取路径名对应于从树的根到叶的移动,根应由路径名左侧的特殊标记指示。由于文件名永远不会为空(因为这通常会令人困惑),因此没有相对路径名以字符 开头>,这使其成为绝对路径名的方便标记。因此>foo是称为文件foo在根目录下,>foo>bar被称为文件bar称为目录foo在根目录中,等等。这将留下根目录,它可能是空字符串;然而,使用空字符串作为路径名通常不方便,所以它被写成>,这有一个额外的好处,即路径名是绝对的,当且仅当它的第一个字符是>.

Unix 采用了 Multics 的这种设计。由于 Unix 已经>在其命令 shell 中使用该字符进行输出重定向,因此其设计者选择了不同的字符/来分隔路径名中的目录。


Kaz*_*Kaz 11

在 Unix 上的路径名组件中,只有两个字符不能使用:空字符,它终止 C(内核语言)中的字符串和斜杠,保留作为路径分隔符。此外,路径组件不能是空字符串。

因此,在路径名中,我们只有两种标记:斜杠和组件。

假设,在不添加任何新标记的情况下,我们希望支持两种类型的路径,相对路径和绝对路径。此外,我们希望能够引用没有名称的根目录(它没有可以为其命名的父目录)。

我们如何仅使用斜杠来表示相对路径、绝对路径和引用根目录?

扩展语言最明显的方法(除了引入新标记)是创建新语法:为无效语法的标记组合赋予新的含义。

以斜杠开头的路径没有意义,所以为什么不使用前导斜杠作为指示“此路径是绝对的,而不是相对的”的标记。

只包含斜杠的路径也是无效的,所以为什么不将其分配为“根目录”的含义。

这两种含义联系在一起,因为绝对路径从根目录开始搜索。换句话说,可以将前导斜线视为具有以下含义:

  • 导航到根目录,并使用斜杠字符。
  • 如果路径中有更多的材料,则将其作为相对路径进行处理,否则就大功告成了。

然后,我们也可以添加一个尾部斜杠,这可能意味着“此路径断言最后一个路径组件是目录的名称,而不是常规文件或任何其他类型的对象:该尾部斜杠表示该目录类似于前导斜杠表示根目录的方式。”

有了以上所有这些语法,我们仍然有未指定含义的语法:双斜线、三斜线等等。

为什么不引入另一个令牌并以不同的方式来做。这可能是因为设计师通常采用简约的方法。(为什么ed编辑器只?在你做错的时候显示a ?)斜线很容易输入,不需要移位。只有两种标记类型(组件和斜线)的路径语言很容易记住和使用。

另一个重要的考虑因素是仅使用字符串表示就可以轻松操作路径。例如,我们可以很容易地“重新根”到新父目录的绝对路径:

OLD_PATH=/old/path
NEW_HOME=/new/home

NEW_PATH="$NEW_HOME$OLD_PATH"  /new/home/old/path
Run Code Online (Sandbox Code Playgroud)

如果我们以其他方式表示绝对路径,比如前导美元符号或其他任何东西,这将不起作用:

OLD_PATH=^old/path  # ^ means absolute path
NEW_HOME=^new/home

# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"
Run Code Online (Sandbox Code Playgroud)

在处理 Unix 样式的路径时,在某些情况下仍然需要这种类型的编码,但数量较少。

  • _“斜线很容易输入,不需要换档。”_ 也许你在池塘对面下车很容易,但在芬兰,我们不仅要按 shift,_还要_ [到达数字行](https ://en.wikipedia.org/wiki/File:KB_Finnish_Multilingual.svg) 也是如此。;P (8认同)