为什么“/”包含“..”?

Emm*_*maV 24 filesystems directory-structure

上面没有目录/,那么里面有什么意义..呢?

Kus*_*nda 32

..根目录中的条目是一种特殊情况。

从 POSIX 标准(4.13 Pathname Resolution,其中...条目分别称为“点”和“点-点”):

特殊文件名点应指代其前任指定的目录。特殊文件名 dot-dot 应指代其前任目录的父目录。作为一种特殊情况,在根目录中,dot-dot 可能指的是根目录本身。

理由有这个要添加(A.4.13 Pathname Resolution

文件名 dot-dot 相对于根目录所指的是实现定义的。在第 7 版中,它指的是根目录本身;这是 POSIX.1-2017 中提到的行为。在某些网络系统中,该构造/../hostname/用于引用另一台主机的根目录,POSIX.1 允许这种行为。

其他网络系统//hostname出于相同目的使用该结构;也就是说,使用了双首字母<slash>。[...]

所以,简而言之,POSIX 标准说每个目录都应该有...条目,并允许..目录条目/ 引用/目录本身(注意引用的第一个文本中的“可能”一词),但它也允许实现让它指代别的东西。

文件系统的最常见实现使/..解析为/.

  • 换句话说,POSIX 说“一个符合 POSIX 的系统必须有 `/..` 但这取决于你想用它做什么” (5认同)

use*_*ser 17

Kusalananda已经告诉你,这是 POSIX 标准规定的行为。然而,UNIX 的历史真正开始于 1970 年代初期。POSIX可以追溯到 1980 年代的后半期,整整十年半之后。在实践中,POSIX 仅仅指定了实现已经完成什么

相反,UNIX 很早就支持将不同设备上的文件系统挂载到其单一的统一目录层次结构中。实际上,每个文件系统都有自己的根目录;挂载的文件系统/在任何方面都不是特别特别。(它的内容可能是,但文件系统本身不是。)

sysmountsysumount系统调用似乎已在UNIX V1(V1根据日期1971年至1911年,已经出台,在1970 - 1971年Unix的树在UNIX遗产协会)。它们在u1.s(系统调用号分别为 21 和 22)中定义并在u7.s 中实现。(PDP7 UNIX,日期为 1970-01,似乎没有任何明显的祖先)。

您可能会看到这是怎么回事:当任何文件系统可以安装在层次结构中的任何位置时,为了避免特殊情况,每个目录,包括每个文件系统的根目录,都应该包含一个指向它自己的父目录。在磁盘上,将文件系统的根目录的父目录项指向的逻辑位置是文件系统的根目录,因为在文件系统的根目录“上方”没有其他任何东西。只有当该文件系统安装在层次结构根目录以外的某个位置时,才能在根目录“上方”放置某些内容的概念。

挂载时,可以将根目录内存副本中的“父目录”指针改写为指向挂载点目录的父目录。如果没有挂载点目录的父目录(换句话说,文件系统被挂载为/),那么就不要管那块数据(因为无论如何可能没有其他明智的地方可以将它指向)或单独处理它稍后(对于Kusalananda 的回答中提到的/../hostname/path//hostname/path案例可能就是这种情况)。

由此产生的行为是,在除 之外的任何目录中/,无论它是特定文件系统的根目录还是子目录(在任何嵌套级别),都..指向该目录的父目录;并在 中/..指向/。前者是什么会感觉自然(..始终工作在以同样的方式,移动你一步步走向的根目录下),而后者,同时轻微的特质,至少不会明显破坏任何东西(几乎没有危害的不能够向根目录移动而不是向根目录本身移动)。例如,您可以敲出任意数量的../并且知道那些至少不会导致错误,因为.. 在某些时候不存在。