删除当前目录时会发生什么?

wen*_*aus 4 ls directory pwd deleted-files

在第一个终端A中,我创建一个目录,进入该目录,并创建一个文件:

$ mkdir test
$ cd test
$ touch file1.txt
$ ls
file1.txt
Run Code Online (Sandbox Code Playgroud)

然后在另一个终端 B 中,我删除了目录:

$ rm -r test
$ mkdir test
$ cd test
$ touch file2.txt
Run Code Online (Sandbox Code Playgroud)

再回到终端 A(不做任何操作cd),我尝试列出文件:

$ ls
Run Code Online (Sandbox Code Playgroud)

ls 没有看到任何东西,也没有抱怨。

后台会发生什么?怎么ls没看出问题?是否有标准的、便携的和/或推荐的方法来找出终端 A 中的某些问题?

pwd只是打印看似正确的目录名称。touch file3.txt说没有这样的文件或目录,这是没有帮助的。只bash -c "pwd"给出了两条很长的错误行,以某种方式表明出了什么问题,但并没有真正的描述性,而且我不确定不同系统之间的可移植性(我在 Ubuntu 16.04 上)。cd .. && cd test解决了问题,但并没有真正解释发生了什么。

Jde*_*eBP 5

怎么ls没看出问题?

首先没有“问题”。

终端 A 中出现问题

没有什么不对的。对打开未链接目录的进程有定义的语义,就像对打开未链接文件的进程有定义的语义一样。两者都是正常的事情。

有定义的语义来取消链接引用某物的目录条目(同时在某处打开某物),然后通过链接到其他东西的原始名称创建目录条目:您现在有两个这样的东西,并引用打开的描述第一个不访问第二个,反之亦然。对于目录和文件都是如此。

一个进程可以通过以下方式拥有一个目录的打开文件描述:

  • 它是进程的工作目录;
  • 它是进程的根目录;
  • 它被调用opendir()库函数的进程打开;或者
  • 它被调用open()库函数的进程打开。

rmdir()允许无法删除的还是开放目录链接(这是一些老Unix系统的行为,而一些非Unix的非Linux POSIX符合规范的系统的行为),并要求如果still-失败打开的目录通过以路径名组件结尾的名称取消链接.;但如果它成功并删除到目录的最终链接,则定义的语义是仍然打开但未链接的目录:

  • 没有目录条目可言;
  • 此后不能创建任何目录条目,即使尝试的进程具有写访问权限或特权访问权限。

你的操作系统是不返回者之一EBUSY,从rmdir()在这种情况下,你的第一终端会话壳具有无连接的,但仍然开放目录作为其当前目录。你所看到的一切都是在那种情况下定义的行为。 ls例如,显示了您当时拥有的两个目录中的第一个空目录。

甚至输出pwd是。当在该 shell 中作为内置命令运行时,该 shell 在内部跟踪 shell/环境变量中当前目录的名称。当在另一个 shell 中作为内置命令运行时,另一个 shell 未能将其工作目录的设备和 i-node 编号与现在由它继承的环境变量的内容命名的第二个目录匹配PWD,从而决定不要相信 的内容PWD然后getcwd()库函数中失败,因为工作目录不再有任何名称,它已被取消链接。

进一步阅读