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

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

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

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

那是如何运作的?

答案1

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

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

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

答案2

Unix 内核跟踪每个进程的工作目录。您可以通过 cd'ing 进入已安装的卷,然后以 root 身份umount在安装点上执行 a 操作来证明这一点。您将收到一些有关设备繁忙情况的消息。

显然,现代 shell 具有他们所说的工作目录,否则当在命令行上给出相对路径时,shell 的子程序(C、Python 或其他)将无法打开正确的文件。

但现代 shell(ksh、bash、zsh,也许还有其他)会在工作目录中玩游戏。您可以通过创建一个在中间层某处具有符号链接的目录树来证明这一点:

% mkdir a
% cd a
% mkdir b.orig
% ln -s b.orig b
% mkdir b.orig/c
% cd .. 
% cd a/b/c
% pwd
/home/bediger/a/b/c

这就是 zsh 的全部内容。它沿着符号链接返回树,如果它只是使用“..”目录向上工作,它会发现a/b.orig/c

相关内容