私は小さな実験を試して、Dir1がDir2の親フォルダになるようにデスクトップディレクトリにDir1とDir2フォルダを2つ作成しました。 /ホーム/ユーザー名/デスクトップ/Dir1/Dir2
その後、cdを使用してパスワードを/home/username/Desktop/Dir1/Dir2に設定しました。次に、rm -r /home/username/Desktop/Dir1 を使用して Dir1 を削除しました。 pwdを使用すると、まだ/home/username/Desktop/Dir1/Dir2としてマークされますが、現在は存在しません。また、この時点でlsまたはcdを使用すると、「Cannot access /home/username/Desktop/Dir1/Dir2: No such file or Directory」というエラーが発生します。これは確かに本当ですが、この問題は次の理由で発生すると思います。フォルダを削除した後、パスワードは更新されません。
私が知る限り、この問題に対する解決策も簡単です。親ディレクトリに移動し、要求したディレクトリを削除できます。
パスワードが更新されない特別な理由があるのか、私の解決策が正しいのか、および/またはバグが見つかったのかどうか疑問に思います。
答え1
実際、Dir2
する存在するが名前 Dir2
確かに。混乱している? :) シェルの現在のディレクトリはまだ name で参照されるディレクトリなので、Dir2
そのディレクトリは変更されません。これは匿名ファイルに似ています。通常、ファイルを作成するときリンク数0になるとファイルが削除され、inodeが解放されます。ただし、プロセスがまだファイルを開いている場合、プロセスが終了して明示的または暗黙的にファイルを閉じるまで、カーネルはファイルを削除しません。このDir2
場合、シェルが現在のディレクトリを変更しない限り、ディレクトリは「オープン」します。
何はいDir1
ディレクトリの名前Desktop
とその下のフルネーム階層(.
および..
エントリを含む)が消えます。呼び出されたディレクトリDir1
も消えました(他のプロセスが現在のディレクトリとして持っていないと仮定)。 iノードレベルのファイルとディレクトリは階層を形成しません。つまり、iノードから親、子、または兄弟アイテムへのリンクはありません。階層は、基本的にファイルやその他のディレクトリを指す(名前、inode)ペアであるディレクトリエントリから個別に構築されます。
この長い紹介の後、元の質問を次のように変更できます。 「Dir2
ディレクトリエントリが削除されたときにシェルが現在のディレクトリを別のディレクトリに変更しないのはなぜですかDir1
?」 1つの理由は、シェルがそれを認識しないためです。この時点で。他のプロセスでrm
プログラムを実行し、ディレクトリを削除しましたが、これについてシェルに通知するメカニズムはありません。第二に、シェルはどのディレクトリを新しい現在のディレクトリとして選択しますか?chdir
新しいディレクトリを含む文字列を引数として使用するシステムコールを使用してディレクトリを変更します。シェルは試すことができますが、chdir("..")
上で見たようにアイテムをすでに破壊しています..
! 3. シェルが現在のディレクトリを変更するのはなぜですか?これを行う理由はなく、どこが快適で、明示的に指示せずに魔法のようにディレクトリを変更することに慣れていません。
もちろん、この状況はやや病的ですが、ユーザーが避けるべき状況です。