我们来看看以下内容:
radu@Radu:~$ mkdir test
radu@Radu:~$ cd test
radu@Radu:~/test$ rmdir ~/test
radu@Radu:~/test$ man ls
man: can't change directory to '': No such file or directory
通常,我会说我的终端之前输出的最后一行是错误的。但我怎样才能理解呢?而为什么只有在命令的情况下才会出现这种情况man
(据我所知;甚至pwd
或ls
没有任何问题)?
此外,我们再看一下:
radu@Radu:~/test$ man ls
man: can't change directory to '': No such file or directory
radu@Radu:~/test$ echo $?
0
什么?成功了吗(参见 的输出man man |& grep -A 1 '^EXIT STATUS$'
)?
另一个版本的男人
当尝试使用man
同一事物的另一个版本时,它会起作用。
$ mkdir mantst
$ cd mantst/
$ man ls <--- works
$ rmdir ../mantst/
$ man ls <--- works
$ man --version
man 2.6.3
答案1
man
和其他命令之间的区别ls
在于,后者(那些不抱怨不存在目录的命令)不会尝试显式地改变那里但已经停留那里。人类也这样做,但它也试图明确地改变那里。
unlink(2)
当您调用或访问UNIX 目录(作为文件)时,它们不会立即被删除rmdir(2)
,而只是删除其父目录中的目录条目。只要有进程引用它们,目录/文件就会保留下来。一旦最后一个引用消失,内核就会有效地删除属于文件/目录的块。
因此,当您调用ls
不再存在的目录时,不会出现错误,因为您的 shell 仍然在那里(它将该目录引用为当前目录),并且ls
从那里开始只是继承了此属性。但由于man
明确尝试到chdir(2)
那里,因此到一个目录入口不再存在了,它就出来了。