Linux中的“stale file handle”是什么意思?

假设我有一个terminal打开,并通过该terminal,我已经cd到某个目录。 通过另一个terminal,我删除该目录,并从相同的备份恢复它。 当我尝试从第一个terminal的vim文件,在同一个目录中,为什么我得到一个关于一个陈旧的文件句柄的错误? 这是什么意思? (在附注中,我发现可以通过cd $(pwd)绕过这个问题。)

当目录被删除时,该目录的inode(及其内容的inode)被回收。 你的shell对该目录的inode(及其内容的inode)的指针现在不再有效了。 当从备份恢复目录时,旧的inode (必然)被重用; 该目录及其内容存储在随机的inode中。 唯一保持不变的是, 目录为已恢复的目录重新使用相同的名称(因为您告诉它)。

现在,如果尝试访问原始shell仍指向的目录的内容,它会将该请求传递给文件系统,作为原始inode的请求,此请求已被回收(甚至可能用于某些现在完全不同了)。 所以你得到一个stale file handle消息,因为你问了一些不存在的数据。

当您执行cd操作时,shell重新评估您给它的任何目标的inode位置。 现在你的shell知道目录的新索引节点(以及它的内容的新索引节点),将来对它的内容的请求将是有效的。