如果删除当前目录并再次 mkdir,则当前目录无效

Current directory is invalid if you remove it and mkdir it again

当用户在当前目录中时,例如Ubuntu bash 中的“/home/test”,如果用户删除此目录并用另一个bash 重新创建它,则旧bash 中的目录无效。但它在新 bash 中有效。有人可以解释为什么会这样吗?

Linux 文件系统中的文件不是由它们的路径标识的,而是由它们的 inode 标识的。新目录路径相同,但不是同一个目录。您的 shell 感到困惑,因为它引用了一个不再存在的目录;存在具有相同路径的另一个目录这一事实对它来说无关紧要。如果您在无效目录中执行 cd $(pwd)(即重新输入),它将被认为是有效的。

想象一下,与您的老板谈论升职。第二天老板被甩了,换人了。你去问你老板升职的事,他说"I have no idea what you're talking about"。你的老老板和新老板都是你的老板;但不是同一个人。同样的事情。


这里有一个有趣的实验来展示 inode-vs-filename 的区别:

( echo foo ; mv test.txt test2.txt ; echo bar ) > test.txt

人们会天真地期望 test2.txtfoo 以及 test.txtbar(我们将 foo 写成 test.txt, 它被移动了,然后我们写 bartest.txt)。但这会生成一个文件 test2.txt,其中包含 foobar。原因是重定向打开test.txt写,这涉及到查找路径,找到分配给该路径的inode,存储在文件描述符中。从那时起,只有文件描述符用于写入(因此是索引节点)。当我们将目录条目从 test.txt 更改为 test2.txt 时,它不会影响 inode。

所以发生的事情是,我们查找 test.txt,获取 inode,将 foo 写入该 inode,更改目录条目以反映文件名的更改,写入 bar 到同一个 inode。这就像和你的老板聊天;老板被解雇;但您发现他在家并继续与他聊天。他的头衔可能已经改变,但他仍然是同一个人。