我已经在Google上对此进行了一些研究,但结果是模糊的。为什么用该/
符号表示根目录。其背后是否有确凿的理由?
chroot()
调用修改了路径名查找时,但是从内部进行查看时,将其抽象化。
/some/dir
总是意味着(root)/some/dir
while some/dir
总是相对于当前工作目录。该原理也可以转移到Web URL使用。
我已经在Google上对此进行了一些研究,但结果是模糊的。为什么用该/
符号表示根目录。其背后是否有确凿的理由?
chroot()
调用修改了路径名查找时,但是从内部进行查看时,将其抽象化。
/some/dir
总是意味着(root)/some/dir
while some/dir
总是相对于当前工作目录。该原理也可以转移到Web URL使用。
Answers:
正斜杠/
是在分离的目录分隔字符路径在类似Unix的操作系统。这个字符似乎是在1970年代的某个时候选择的,根据传闻,原因可能与Unix的前身Multics操作系统使用该>
字符作为路径分隔符有关,但是Unix的设计者已经保留了该字符。在使用多级文件系统之前,这些字符>
并<
在shell命令行上表示I / O重定向。因此,当需要设计文件系统时,他们必须找到另一个字符来表示路径名元素分隔。
这里要注意的一点是,在1970年代普遍使用的Lear-Siegler ADM-3A终端中,除此以外,使用~
字符表示主目录的做法也由此而来,该/密钥紧挨着该>密钥:
至于为什么用单个符号表示根目录/
,这是一个很可能受以下事实影响的约定:根目录是目录层次结构的顶层目录,而其他目录可能在其下,但通常没有”引用根目录之外的任何内容的原因。同样,目录条目本身也没有名称,因为它是可见目录树的边界。
/
。Unix文件系统是一棵树,带有用于各种驱动器的安装点。
chroot
这样的-您无法访问新根目录之外的任何内容,但这并不意味着它们不存在。
chroot()
引入时,它根本没有任何类似于监狱的属性,仅影响路径名解析。即使在今天,特权流程也可以 通过设计突破。我chroot()
在前面的评论中也提到过。
>
目录分隔符,还<
用于引用父目录:<
本身等效于..
,而<foo
等效于../foo
。我总觉得这在美学上令人愉悦。
我们今天知道的第一个分层文件系统是为Multics设计的。RC Daley和PG Neumann 在“辅助存储的通用文件系统”中描述了该设计。该文件系统的显着特征是目录是可以像其他任何文件一样包含在目录中的文件。文件结构形成一棵树,其中所有非叶节点都是目录。树的根始终是目录。每个文件都有一个名称(条目名称),该名称在其父目录中是唯一的。根目录没有名称,因为它不包含在另一个目录中。
为了指定文件,您需要描述从树的根开始的路径。Multics为路径名采用了自然语法,其中if P
是目录的路径,并且F
是文件的名称,那么if 是目录内部调用的文件的语法,其路径为。P>F
F
P
在那些您不想给目录增加负担的时代,Multics有一个working directory的概念。没有目录指示的裸文件名将解释为工作目录中的文件。
结合这些规则,foo
是工作目录中的一个文件;foo>bar
是foo
工作目录的子目录中的文件,依此类推。这些规则描述了相对路径,但是需要一个补充规则来从根目录开始构建绝对路径。假设从左到右读取路径名对应于从树的根部到叶子的移动,则应在路径名左侧使用特殊标记来指示根。由于文件名永远不会为空(因为这常常会造成混淆),因此,相对路径名都不会以character开头>
,这使得它成为绝对路径名的便捷标记。因此>foo
是foo
在根目录中>foo>bar
调用的文件,是bar
在目录中调用的文件foo
在根目录中,依此类推。这将保留根目录,该目录可能是空字符串。但是,将空字符串用作路径名通常不方便,因此它会被写入>
,这还有一个好处,即当且仅当第一个字符为时,路径名才是绝对路径>
。
Unix采用了Multics的这种设计。由于Unix已经>
在命令外壳中使用该字符进行输出重定向,因此其设计者选择了其他字符/
来分隔路径名中的目录。
在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样式的路径时,在某些情况下仍然需要这种类型的编码,但是这种编码很少。
/
用右脚键入。就像弹钢琴一样。
cd /home
相当于cd /home/
附加/
在空名称的末尾提供访问该目录。