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
解决了问题,但并没有真正解释发生了什么。
怎么
ls
没看出问题?
首先没有“问题”。
终端 A 中出现问题
没有什么不对的。对打开未链接目录的进程有定义的语义,就像对打开未链接文件的进程有定义的语义一样。两者都是正常的事情。
有定义的语义来取消链接引用某物的目录条目(同时在某处打开某物),然后通过链接到其他东西的原始名称创建目录条目:您现在有两个这样的东西,并引用打开的描述第一个不访问第二个,反之亦然。对于目录和文件都是如此。
一个进程可以通过以下方式拥有一个目录的打开文件描述:
opendir()
库函数的进程打开;或者open()
库函数的进程打开。rmdir()
允许无法删除的还是开放目录链接(这是一些老Unix系统的行为,而一些非Unix的非Linux POSIX符合规范的系统的行为),并要求如果still-失败打开的目录通过以路径名组件结尾的名称取消链接.
;但如果它成功并删除到目录的最终链接,则定义的语义是仍然打开但未链接的目录:
你的操作系统是不返回者之一EBUSY
,从rmdir()
在这种情况下,你的第一终端会话壳具有无连接的,但仍然开放目录作为其当前目录。你所看到的一切都是在那种情况下定义的行为。 ls
例如,显示了您当时拥有的两个目录中的第一个空目录。
甚至输出pwd
是。当在该 shell 中作为内置命令运行时,该 shell 在内部跟踪 shell/环境变量中当前目录的名称。当在另一个 shell 中作为内置命令运行时,另一个 shell 未能将其工作目录的设备和 i-node 编号与现在由它继承的环境变量的内容命名的第二个目录匹配PWD
,从而决定不要相信 的内容PWD
,然后在getcwd()
库函数中失败,因为工作目录不再有任何名称,它已被取消链接。
rmdir()
. “系统接口”。 开放组基本规范。IEEE 1003.1:2017。