我已经在Google上对此进行了一些研究,但结果令人困惑。为什么使用/符号表示根目录。背后有什么可靠的理由吗?

评论

原因是'/'是目录分隔符,而根目录本身是无名的,就像cd / home等效于cd / home /附加/在空名称末尾提供对该目录的访问。
您是否已阅读以下内容:en.wikipedia.org/wiki/Root_directory?

它是无名的,因为当从内部查看时,它是可见目录树的边界。可见目录层次结构可能只是更大层次结构中的子树,例如,当通过chroot()调用修改了路径名查找时,但是从内部进行查看时,则会被抽象掉。

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

除了提到的内容外,使用/表示根还会在绝对路径名和相对路径名方面产生某些副作用。 / some / dir始终表示(root)/ some / dir,而some / dir始终相对于当前工作目录。此原则也可以转移到Web URL使用。

#1 楼

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

这里要注意的一点是,在Lear-Siegler ADM-3A终端中在1970年代,使用~字符表示主目录的实践起源于此,/键位于>键旁边:对于为什么用单个/表示根目录,这是一个很可能受以下事实影响的约定:根目录是目录层次结构的顶层目录,而其他目录可能在其下,但通常不会引用根目录之外的任何内容的原因。同样,目录条目本身也没有名称,因为它是可见目录树的边界。

评论


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

–alexis
2013年12月3日14:53



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

–鲍勃森
13年12月3日在15:16

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

–alexis
13年12月3日,19:35

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

–托马斯·尼曼(Thomas Nyman)
2013年12月4日5:59



IIRC,Multics约定不仅使用>作为目录分隔符,还使用<引用父目录:<本身等效于..,而
–马克·里德(Mark Reed)
2013年12月11日23:07

#2 楼

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

要指定文件,您需要描述从树根开始的路径。 Multics为路径名采用了自然语法,如果P是目录的路径,而F是文件名,则P>F是目录内的F文件的语法,该文件的路径是P。 />在那些不想让目录负担的时代,Multics拥有工作目录的概念。没有目录指示的裸文件名被解释为工作目录中的文件。

结合这些规则,foo是工作目录中的一个文件; foo>bar是工作目录的子目录foo中的文件,依此类推。这些规则描述了相对路径,但是需要一个补充规则来从根目录开始构建绝对路径。假设从左到右读取路径名对应于从树的根到叶的移动,则应在路径名的左侧用特殊标记指示根。由于文件名永远不会为空(因为这常常会造成混淆),因此没有相对路径名都以字符>开头,这使它成为绝对路径名的便捷标记。因此,>foo是根目录中名为foo的文件,>foo>bar是根目录中名为bar的目录中名为foo的文件,依此类推。这将保留根目录,该目录可能是空字符串。但是,将空字符串用作路径名通常并不方便,因此它会被写入>,这具有以下额外的好处:当且仅当其首字符为>时,路径名才是绝对路径。 Unix采用了Multics的这种设计。由于Unix在命令外壳中已经使用字符>进行输出重定向,因此其设计者选择了另一个字符/来分隔路径名中的目录。

#3 楼

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

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

,在不添加任何新令牌的情况下,我们希望支持两种类型的路径,相对路径和绝对路径。此外,我们希望能够引用没有名称的根目录(没有父级的名称)。

我们如何表示相对路径,绝对路径,并仅使用斜杠引用根目录?是无效的语法。

以斜杠开头的路径没有意义,因此为什么不使用前导斜杠作为标记来表示“此路径是绝对路径,而不是相对路径”。
仅包含斜杠的路径也是无效的,所以为什么不给它分配“根目录”的含义。

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


导航到根目录,并使用斜杠字符。
如果路径中包含更多内容,然后将其作为相对路径进行处理,否则就完成了。目录的名称,而不是常规文件或任何其他类型的对象的名称:后跟斜杠表示该目录的方式类似于前导斜杠表示根目录的方式。“通过以上所有语法,我们仍然具有未分配含义的语法:双斜杠,三斜杠等。

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

另一个重要的考虑因素是,仅使用字符串表示形式就可以轻松地操纵路径。例如,我们可以很容易地将绝对路径“重新建立”到新的父目录中: ,例如前导美元符号或其他符号:

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

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


在某些情况下,使用Unix风格的路径仍需要这种编码,但是它。

评论


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

–托马斯·尼曼(Thomas Nyman)
2013年12月3日19:16



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

–卡兹
13年12月3日在22:38

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

–托马斯·尼曼(Thomas Nyman)
2013年12月4日7:48



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

–卡兹
2013年12月4日8:00

@ThomasNyman,现在我相信有“踏板”键盘,您可以使用右脚键入/。就像弹钢琴一样。

–起搏器
15年1月23日在9:31