111正斜杠/是Unix类操作系统中路径中分隔目录的定界字符。据传说中的来源称,这个字符似乎是在1970年代选择的。原因可能与Unix的前身——Multics操作系统使用>作为路径分隔符有关。但是,在Unix的设计者们拥有多级文件系统之前,他们已经保留了>和<字符来表示shell命令行上的I/O重定向。所以当设计文件系统时,他们不得不寻找另一个字符来表示路径名元素的分隔。
这里需要注意的一件事是,在20世纪70年代常用的Lear-Siegler ADM-3A终端中,其中包括使用“~”字符表示主目录的实践,/键位于>键旁边。
关于为什么根目录用单个/表示,这是一个习惯,很可能受到了根目录作为目录层次结构的最顶层目录的影响。虽然其他目录可能在其下方,但通常没有必要引用根目录之外的内容。类似地,目录条目本身没有名称,因为它就是可见目录树的边界。
- Thomas Nyman82虽然其他目录可能位于其下方,但通常没有理由引用根目录之外的任何内容。我不太明白这句话的意思。我不确定你所说的“下方”是指哪个方向,但在/挂载的层次结构中没有任何东西“在外面”。Unix文件系统是一棵单一的树,其中包含各个驱动器的挂载点。 - alexis在某种程度上,可以说远程文件是“位于根目录之外”——当然,你要挂载它们,然后它们就不再“位于根目录之外”了。将某个东西绑定到chroot下可能是另一种解释。 - Gilles 'SO- stop being evil'4还有chroot和诸如此类的东西 - 你不能访问新根目录之外的任何东西,但这并不意味着它们不存在。 - Bobson1@Gilles,硬盘的物理位置并不是问题。从那个意义上说,任何磁盘分区都在根分区之外,但它在文件系统层次结构中被挂载在根目录下。Bobson,关于chroot的观点很好,但它与Thomas所说的不符合:在chroot之后,“通常没有理由”离开系统根目录;这是不可能的。在Unix中,文件系统中的“一切”都在根目录下。 - alexis1在chroot之后,“通常没有理由”离开系统根目录,这是不正确的说法;事实上是不可能的。在引入chroot()时,它根本没有任何类似监狱的属性,只是影响路径名解析。即使在今天,特权进程也可以通过设计打破chroot限制。我在早前的评论中也提到了chroot()。 - Thomas Nyman1我不确定你所指的“beneath”是指哪个方向...“Beneath”是指从根节点开始的任何子树,因为树结构通常是以根节点位于顶部来表示的。 - Thomas Nyman4据我所知,Multics约定不仅使用>作为目录分隔符,还使用<来表示父目录:单独的<等同于..,而 为了指定一个文件,你需要描述从树的根目录开始的路径。Multics采用了一种自然语法来表示路径名,其中如果P是一个目录的路径,F是一个文件的名称,那么P>F就是文件的语法,它位于路径为P的目录中,名为F。 对于那些不想负担目录的时候,Multics有一个工作目录的概念。没有目录指示的裸文件名被解释为工作目录中的文件。 结合这些规则,foo 是工作目录中的一个文件;foo>bar 是工作目录下的子目录 foo 中的一个文件,以此类推。这些规则描述了相对路径,但是需要补充一条规则来构建从根目录开始的绝对路径。考虑到从左到右读取路径名对应于从根到树叶的移动,根应该在路径名左侧用特殊标记表示。由于文件名永远不为空(因为那经常会令人困惑),没有相对路径名以字符>开头,这使得它成为绝对路径名的方便标记。因此,>foo 是称为foo的文件在根目录中,>foo>bar 是称为bar的文件在称为foo的目录中在根目录中,以此类推。这留下了根目录,它可以是空字符串;然而,使用空字符串作为路径名通常不方便,因此它被写成>,这有额外的好处,即只有路径名的第一个字符是>时,它才是绝对路径。 Unix从Multics采用了这个设计。由于Unix已经在其命令shell中使用字符>进行输出重定向,因此它的设计者选择了不同的字符/来分隔路径名中的目录。 - Gilles 'SO- stop being evil'回答链接11在Unix中的路径名组成部分中,只有两个字符不能使用:空字符(用于C语言(内核语言)中终止字符串)和斜杠(用作路径分隔符)。此外,路径组件不能是空字符串。 因此,在路径名中,我们只有两种类型的标记:斜杠和组件。 假设我们想要支持两种类型的路径,相对路径和绝对路径,并且还想引用没有名称的根目录(它没有父目录可以给它命名),而不添加任何新的标记。 我们如何使用只有斜杠来表示相对路径、绝对路径并引用根目录? 除了引入新标记之外,最明显的扩展语言的方法是创建新的语法:为无效语法的标记组合赋予新含义。 以斜杠开头的路径没有意义,所以为什么不将前导斜杠用作标记,表示“此路径是绝对路径,而不是相对路径”。 只包含斜杠的路径也是无效的,所以为什么不将其赋予“根目录”的含义。 这两个意思是相互关联的,因为绝对路径从根目录开始搜索。换句话说,一个前导斜杠可以被视为具有以下含义: 1. 导航到根目录,并消耗斜杠字符。 2. 如果路径中还有更多内容,则将其处理为相对路径,否则完成。 另外,我们也可以考虑到末尾的斜杠,它表示该路径的最后一个组成部分是目录名而不是常规文件或其他类型的对象。末尾的斜杠类似于前导斜杠表示根目录。 尽管有上述语法,但我们仍然有一些未分配含义的语法:双斜杠、三斜杠等等。 为什么不引入另一个标记并采用不同的方式呢?这可能是因为设计者总体上采取了极简主义的方法。(为什么当你在ed编辑器中做错事时,只会显示一个问号?)斜杠很容易输入,无需按Shift键。只有两种令牌类型(组件和斜杠)的路径语言易于记忆和使用。 另一个重要的考虑因素是,只使用字符串表示就可以轻松地对路径进行操作。例如,我们可以很容易地将绝对路径“重新根目录”到一个新的父目录中: 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路径时,仍然需要这种类型的编码,但是用得较少。 - Kaz58斜杠很容易输入,不需要按Shift键。也许在大海彼岸的你那边很轻松,但在芬兰,我们不仅要按Shift键,还需要伸手去按数字键盘上的字符。 ;P - Thomas Nyman1@ThomasNyman 无论如何,对于肯·汤普森来说,外国键盘布局可能并不是一个问题。对Unix开发人员和早期用户来说,斜杠的输入很容易。 - Kaz1说得对。尽管我大部分是在开玩笑,但我确实发现一些软件中的奇特之处(有时候还挺有趣)可以通过一些现代硬件的奇特之处来解释。这些软件的悠久历史也能解释其中的一些独特之处。 - Thomas Nyman@ThomasNyman 哈哈,我想知道如果Bill Joy亲自登录并更新ADM-3A页面中的{citation-needed}部分,是否会有一些“Wikidickhead”反驳说:“这篇文章包含原创研究”。 :) - Kaz@ThomasNyman,现在我相信有“踏板”键盘可以用右脚输入“/”。就像弹钢琴一样。 - Pacerier回答链接