当您移动其工作目录时,bash 如何继续正常工作?

Rob*_*een 5 directory cd-command open-files rename

在 Linux 上,我使用 将一个目录移动到另一个目录mv,而在另一个 shell 中,我的工作目录恰好是被移动的目录。

hg pull在那个 shell 中运行,令我惊讶的是,它在新的工作目录中正确运行 - 无需我输入cd.

那是怎么工作的?

Cal*_*leb 11

移动文件或目录会更改在文件树中标识其父级的元数据属性,但不会更改其实际节点 ID。在物理磁盘上它仍然在同一个地方,文件系统仍然知道它是同一个对象。在文件或目录指针打开的任何地方,它都已经连接到该对象,并且对对象元数据的更改不会影响打开的进程。只有当您尝试根据文件系统路径打开新指针时,事情才会中断。

出于同样的原因,您可以移动正在写入的文件,并且写入将继续到新位置;因为它实际上是同一个文件节点,只是重新附加到文件结构中的不同位置。磁盘上的物理位置和节点 ID 都不会改变,文件系统只是将磁盘上节点的内部映射更新为文件系统中的路径。

还要注意的是,此行为仅适用于移动的对象保留在同一文件系统上的情况。如果您将它从一个安装位置移动到另一个安装位置,则节点的物理位置必须更改,并且该对象将从原始文件系统中删除,从而留下死指针!