もはや存在しない(?)フォルダで "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(私が知っている限り、問題が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エラーは発生しません。lsしかし、man明示的にそこに到達しようとしたので、chdir(2)ディレクトリに移動しました。入り口もう存在せず出てきます。

関連情報