web-dev-qa-db-ja.com

ディレクトリを削除した後、pwdが更新されないのはなぜですか?

デスクトップディレクトリ内にDir1とDir2の2つのフォルダを作成して、Dir1がDir2の親になるようにする小さな実験を試みました。/home/username/Desktop/Dir1/Dir2

次に、cdを使用してpwdを/ home/username/Desktop/Dir1/Dir2として設定します。次に、rm -r/home/username/Desktop/Dir1を使用してDir1を削除しました。これで、pwdを使用すると、/ home/username/Desktop/Dir1/Dir2と表示されますが、これは現在存在していません。また、この時点でlsまたはcdを使用すると、「/ home/username/Desktop/Dir1/Dir2にアクセスできません:そのようなファイルまたはディレクトリはありません」というエラーが生成されます。これは絶対に正しいですが、この問題が発生したと考えていました。フォルダの削除後にpwdが更新されない。

これに対する解決策も、私が考える限り簡単です。親ディレクトリに移動して、要求されたディレクトリを削除することができます。

Pwdが更新されない特定の理由があるかどうか、解決策は正しいか、バグを見つけたかどうかを知りたいですか?

2
Ashish

実際には、_Dir2_ doesは存在しますが、name _Dir2_は存在しません。混乱していますか? :)シェルの現在のディレクトリは、_Dir2_という名前で参照されるディレクトリのままであり、これにより、ディレクトリはそのままになります。これは匿名ファイルに似ています。通常、ファイルlink countがゼロになると、ファイルが削除され、iノードが解放されます。ただし、プロセスがまだファイルを開いている場合、カーネルは、プロセスが終了することによって明示的または暗黙的にファイルを閉じるまで、ファイルを削除しません。 _Dir2_の場合、シェルは現在のディレクトリを変更しない限り、ディレクトリを「開いた」ままにします。

isなくなったのは、Desktopカタログの名前_Dir1_と、その下の名前の階層全体(_._および_.._エントリを含む)です。 。以前は_Dir1_と呼ばれていたディレクトリもなくなりました(他のプロセスが現在のディレクトリとして持っていない場合)。 iノードレベルのファイルとディレクトリは階層を形成しません。つまり、iノードから親、子、または兄弟のエントリへのリンクはありません。階層は、ファイルやその他のディレクトリを指す、本質的に(name、inode)ペアであるディレクトリエントリによって個別に構築されます。

この長い紹介の後、元の質問を次のように言い換えることができます。「ディレクトリエントリ_Dir2_が_Dir1_から削除されたときに、シェルが現在のディレクトリを別のディレクトリに変更しないのはなぜですか?」まあ、1つの理由はシェルがこれさえ知らないということです。他のプロセスがrmプログラムを実行し、ディレクトリを削除しましたが、シェルがこれについて通知されるメカニズムはありません。次に、シェルは新しい現在のディレクトリとしてどのディレクトリを選択しますか?ディレクトリは、chdirシステムコールを使用して変更されます。このシステムコールは、新しいディレクトリを含む文字列を引数として取ります。シェルはchdir("..")を試すことができますが、上で見たように、すでに_.._エントリを破棄しました!第三に、なぜシェルは現在のディレクトリを変更する必要があるのですか?そうする理由はなく、どこに座っても快適であり、明示的に指示されない限り、ディレクトリを魔法のように変更する習慣はありません。

確かに、状況は一種の病的なものですが、それを回避するのはユーザーの責任です。

4
Johan Myréen