web-dev-qa-db-ja.com

存在しなくなったフォルダから `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
3
Radu Rădeanu

manlsのような他のコマンドの違いは、後者のコマンド(存在しないディレクトリについて文句を言わないもの)は明示的にchangeそこにあるが、すでに滞在そこに。男もそうですが、それはさらにそこでも明示的に変更しようとします。

UNIXディレクトリ(ファイルとして)は、unlink(2)またはrmdir(2)を呼び出してもすぐには削除されませんが、親ディレクトリ内のディレクトリエントリだけが削除されます。ディレクトリ/ファイルは、それらを参照するプロセスがある限り存続します。最後の参照がなくなるとすぐに、カーネルはファイル/ディレクトリに属する​​ブロックを効果的に削除します。

このため、シェルがまだ存在し(ディレクトリを現在のディレクトリとして参照している)、そこからlsが開始されているため、存在しないディレクトリでlsを呼び出してもエラーは発生しません。このプロパティを継承します。しかし、manは明示的にそこでchdir(2)を試み、したがって、もう存在しないディレクトリentryに移動しようとするため、救済されます。

3
Andreas Wiese