以下を見てみましょう。
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)
ディレクトリに移動しました。入り口もう存在せず出てきます。