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


95

我已经在Google上对此进行了一些研究,但结果是模糊的。为什么用该/符号表示根目录。其背后是否有确凿的理由?


12
其原因是,“/”是目录和分离器,而根目录本身是无名,就像cd /home相当于cd /home/附加/在空名称的末尾提供访问该目录。
SF。

2
您已阅读以下内容:en.wikipedia.org/wiki/Root_directory吗?
Kevdog777

11
它是无名的,因为当从内部查看时,它是可见目录树的边界。可见目录层次结构可能只是较大层次结构中的子树,例如,通过chroot()调用修改了路径名查找时,但是从内部进行查看时,将其抽象化。
Thomas Nyman 2013年

14
因为空字符串将是一个可怕的选择!
Bakuriu

3
除了提到的内容外,使用/表示根还会对绝对路径名和相对路径名产生某些副作用。/some/dir总是意味着(root)/some/dirwhile some/dir总是相对于当前工作目录。该原理也可以转移到Web URL使用。
Tor Valamo 2013年

Answers:


108

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

这里要注意的一点是,在1970年代普遍使用的Lear-Siegler ADM-3A终端中,除此以外,使用~字符表示主目录的做法也由此而来,该/密钥紧挨着该>密钥:

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

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


2
“虽然其他目录可能位于其下,但通常没有理由引用根目录之外的任何内容。” 我不明白 我不确定您在“下方”指的是哪个方向,但是在处安装的层次结构没有 “外部” /。Unix文件系统是一棵树,带有用于各种驱动器的安装点。
Alexis

4
还有chroot这样的-您无法访问新根目录之外的任何内容,但这并不意味着它们不存在。
Bobson

1
@Gilles,驱动器的物理位置不是问题。从这个意义上讲,任何磁盘分区都在根分区之外,但是它安装文件系统层次结构的根目录。Bobson是关于chroot的好地方,但与Thomas所说的不符:chroot之后,并不是“通常没有理由”走出系统根目录。不可能。在Unix上,文件系统中的所有内容都位于根目录下。
Alexis

1
“在chroot之后,并不是“通常没有理由”走出系统根目录;这是不可能的。” 这是完全错误的。在chroot()引入时,它根本没有任何类似于监狱的属性,仅影响路径名解析。即使在今天,特权流程也可以 通过设计突破。我chroot()前面的评论中也提到
Thomas Nyman 2013年

4
IIRC,Multics约定不仅用作>目录分隔符,还<用于引用父目录:<本身等效于..,而<foo等效于../foo。我总觉得这在美学上令人愉悦。
马克·里德

55

我们今天知道的第一个分层文件系统是为Multics设计的。RC Daley和PG Neumann 在“辅助存储的通用文件系统”中描述了该设计。该文件系统的显着特征是目录是可以像其他任何文件一样包含在目录中的文件。文件结构形成一棵树,其中所有非叶节点都是目录。树的根始终是目录。每个文件都有一个名称(条目名称),该名称在其父目录中是唯一的。根目录没有名称,因为它不包含在另一个目录中。

为了指定文件,您需要描述从树的根开始的路径。Multics为路径名采用了自然语法,其中if P是目录的路径,并且F是文件的名称,那么if 是目录内部调用的文件的语法,其路径为。P>FFP

在那些您不想给目录增加负担的时代,Multics有一个working directory的概念。没有目录指示的裸文件名将解释为工作目录中的文件。

结合这些规则,foo是工作目录中的一个文件;foo>barfoo工作目录的子目录中的文件,依此类推。这些规则描述了相对路径,但是需要一个补充规则来从根目录开始构建绝对路径。假设从左到右读取路径名对应于从树的根部到叶子的移动,则应在路径名左侧使用特殊标记来指示根。由于文件名永远不会为空(因为这常常会造成混淆),因此,相对路径名都不会以character开头>,这使得它成为绝对路径名的便捷标记。因此>foofoo在根目录中>foo>bar调用的文件,是bar在目录中调用的文件foo在根目录中,依此类推。这将保留根目录,该目录可能是空字符串。但是,将空字符串用作路径名通常不方便,因此它会被写入>,这还有一个好处,即当且仅当第一个字符为时,路径名才是绝对路径>

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


11

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

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

假设不添加任何新标记,我们希望支持两种相对路径,即相对路径和绝对路径。此外,我们希望能够引用没有名称的根目录(没有父级名称)。

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

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

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

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

这两个含义联系在一起,因为绝对路径开始在根目录中搜索。换句话说,斜杠可以被认为具有以下含义:

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

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

通过以上所有语法,我们仍然具有未分配含义的语法:双斜杠,三斜杠等。

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

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

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

NEW_PATH="$NEW_HOME$OLD_PATH"  /new/home/old/path

如果我们以其他方式表示绝对路径,例如前导美元符号或其他符号,则此方法将不起作用:

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#^}"

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


8
“斜线很容易键入,不需要移位。” 也许您会在池塘对面轻松下车,但是在芬兰,我们不仅需要按班次,而且还 可以遍及整个数字行。; P
Thomas Nyman

1
@ThomasNyman也许如此,Ken Thompson可能不关心外部键盘布局。对于Unix开发人员及其早期用户而言,斜线很容易键入。
卡兹(Kaz)2013年

1
很公平。尽管我主要是在开玩笑,但我确实感到很有趣(有时很有趣),如何现代硬件的特殊性来解释具有悠久历史的软件的 某些特殊性
Thomas Nyman 2013年

@ThomasNyman Haha,我想知道Bill Joy本人是否登录并更新了ADM-3A页面中的{citation-need}部分,会出现“ Wikidickhead”字样,然后反驳为:“本文包含原始研究内容”。:)
Kaz

@ThomasNyman,现在我相信有“踏板”键盘,您可以/用右脚键入。就像弹钢琴一样。
Pacerier,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.