以下を見てみましょう。
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
man
とls
のような他のコマンドの違いは、後者のコマンド(存在しないディレクトリについて文句を言わないもの)は明示的にchangeそこにあるが、すでに滞在そこに。男もそうですが、それはさらにそこでも明示的に変更しようとします。
UNIXディレクトリ(ファイルとして)は、unlink(2)
またはrmdir(2)
を呼び出してもすぐには削除されませんが、親ディレクトリ内のディレクトリエントリだけが削除されます。ディレクトリ/ファイルは、それらを参照するプロセスがある限り存続します。最後の参照がなくなるとすぐに、カーネルはファイル/ディレクトリに属するブロックを効果的に削除します。
このため、シェルがまだ存在し(ディレクトリを現在のディレクトリとして参照している)、そこからls
が開始されているため、存在しないディレクトリでls
を呼び出してもエラーは発生しません。このプロパティを継承します。しかし、man
は明示的にそこでchdir(2)
を試み、したがって、もう存在しないディレクトリentryに移動しようとするため、救済されます。