当用户位于当前目录时,例如Ubuntu bash 中的“/home/test”,如果用户删除该目录并使用另一个 bash 重新创建它,则旧 bash 中的目录无效。但它在新的 bash 中有效。有人可以解释为什么会发生吗?
最佳答案
Linux 文件系统中的文件不是通过其路径来标识的,而是通过其 inode 来标识的。 。新目录具有相同的路径,但不是同一个目录。您的 shell 很困惑,因为它引用了一个不再存在的目录;事实上,存在具有相同路径的另一个目录对此并不重要。如果您在无效目录中执行cd $(pwd)
(即重新输入它),它将被认为是有效的。
想象一下与您的老板谈论升职事宜。第二天,老板被解雇了,并由其他人取代。你去问你的老板关于升职的事,他说“我不知道你在说什么”。你的旧老板和新老板都是你的老板;但不是同一个人。同样的事情。
<小时/>这是一个有趣的实验来展示 inode-vs-filename 的差异:
( echo foo ; mv test.txt test2.txt ; echo bar ) > test.txt
人们会天真地期望我们有 test2.txt
与 foo
和 test.txt
与 bar
(我们将 foo
写入 test.txt
,它被移动,然后我们将 bar
写入 test.txt
)。但这会生成一个包含 foo
和 bar
的文件 test2.txt
。原因是重定向打开 test.txt
进行写入,这涉及查找路径并找到分配给该路径的 inode,将其存储在文件描述符中。从那时起,仅使用文件描述符(以及 inode )进行写入。当我们将目录项从 test.txt
更改为 test2.txt
时,不会影响 inode。
所以发生的事情是,我们查找 test.txt
,获取 inode,将 foo
写入该 inode,更改目录条目以反射(reflect)文件名的更改,将 bar
写入同一 inode。这就像和你的老板聊天一样;老板被解雇;但你发现他在家并继续和他聊天。他的头衔可能已经改变,但他仍然是同一个人。
关于linux - 如果删除当前目录并再次 mkdir,则当前目录无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57985731/