当我从不再存在的文件夹运行“man”命令时出现奇怪的错误(?)

当我从不再存在的文件夹运行“man”命令时出现奇怪的错误(?)

我们来看看以下内容:

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(据我所知;甚至pwdls没有任何问题)?

此外,我们再看一下:

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)那里,因此到一个目录入口不再存在了,它就出来了。

相关内容