Bash
刪除目錄時出現“ls”錯誤
我有兩個殼打開。第一個在目錄 A 中。在第二個中,我刪除目錄 A,然後重新創建它。當我回到第一個 shell 並鍵入
ls
時,輸出為:ls: cannot open directory .: Stale file handle
為什麼?我認為第一個 shell(在不存在的目錄中保持打開的那個)會在等待下一個命令時“凍結”,並且不會“意識到”該目錄已被刪除並重新創建。除了字元串之外,shell 是否持有對其目前工作目錄的“更深”引用
$PWD
?
目錄(像任何文件一樣)不是由其名稱定義的。將名稱視為目錄的地址。當你移動目錄時,它仍然是同一個目錄,就像如果你搬到不同的房子,你仍然是同一個人。如果您刪除一個目錄並以相同的名稱創建一個新目錄,那麼它就是一個新目錄,就像搬進您曾經住過的房子的人不是您一樣。
每個程序都有一個工作目錄。shell 中的
cd
命令更改 shell 的目前工作目錄。該pwd
命令列印出目前工作目錄的¹路徑。當您刪除目錄 A 時,這樣做是在其父目錄中刪除 A 的條目。目錄 A 本身保留在文件系統中,但處於分離狀態,沒有名稱。它還沒有被刪除,因為它正在被一個程序使用,即第一個 shell。當您在第一個 shell 中更改目錄時,該目錄最終被刪除。當一個文件被刪除而程序仍然打開時,也會發生同樣的事情:文件的目錄條目被立即刪除,而文件本身在停止使用時被刪除。
同樣,觀察移動目錄時會發生什麼。
mkdir one two touch one/1 two/2 cd one ls
在另一個外殼中:
mv one tmp mv two one mv tmp two
在第一個外殼中:
ls
該文件
1
位於最初呼叫的目錄中,one
現在稱為two
. 該文件2
位於最初呼叫的目錄中,two
現在稱為one
.¹更準確地說,是一條路徑,如果涉及符號連結或其他微妙之處,它可能不是唯一的。