ディレクトリ削除時に「ls」エラーが発生する

ディレクトリ削除時に「ls」エラーが発生する

2つの殻が開いています。最初はAディレクトリにあります。 2番目は、ディレクトリAを削除して再作成します。最初のシェルに戻り、と入力すると、ls出力は次のようになります。

ls: cannot open directory .: Stale file handle

なぜ?私は、最初のシェル(存在しないディレクトリに開いているシェル)が次のコマンドを待っている間に「停止」し、ディレクトリが削除され、再作成されたことを「認識」できないと思います。シェルには、文字列に加えて現在の作業ディレクトリへの「より深い」参照がありますか$PWD

ベストアンサー1

他のファイルと同様に、ディレクトリは名前で定義されません。名前をディレクトリ名として扱う住所。ディレクトリを移動しても同じディレクトリです。まるで別の家に移動しても、まだ同じ人のようです。ディレクトリを削除して同じ名前で新しいディレクトリを作成すると、以前に住んでいた家に引っ越してきた人があなたではなかったかのように新しいディレクトリになります。

すべてのプロセスにタスクリストcdシェルのコマンドは、シェルの現在の作業ディレクトリを変更します。このpwdコマンドは、現在の作業ディレクトリのパスを印刷します。

ディレクトリAを削除すると、親ディレクトリにあるAのエントリのみが削除されます。ディレクトリA自体は、ファイルシステムに残っているが名前のない分離状態です。プロセス(つまり、最初のシェル)で使用されているため、まだ削除されていません。最初のシェルでディレクトリを変更すると、そのディレクトリは最終的に削除されます。プロセスが開いている間にファイルを削除すると、同じことが起こります。ファイルのディレクトリエントリは直ちに削除され、ファイル自体は使用が中断されると削除されます。

同様に、ディレクトリを移動するときに何が起こるかを見てください。

mkdir one two
touch one/1 two/2
cd one
ls

他のシェルから:

mv one tmp
mv two one
mv tmp two

最初のシェルでは:

ls

ファイルは元1の名前のディレクトリにあり、現在は名前のoneディレクトリにあります。two2twoone

より正確には、パスは、シンボリックリンクやその他の微妙な部分が含まれている場合は一意でない可能性があります。

おすすめ記事