為什麼刪除目錄後密碼不更新?
我嘗試了一個小實驗,在我的桌面目錄中創建了 2 個文件夾 Dir1 和 Dir2,這樣 Dir1 是 Dir2 的父級。/home/使用者名/桌面/Dir1/Dir2
然後,我使用 cd 將我的密碼設置為 /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 沒有更新,我的解決方案是否正確和/或我剛剛發現了一個錯誤?
實際上,
Dir2
確實存在,但名稱Dir2
不存在。使困惑?:) shell 的目前目錄仍然是 name 引用的目錄Dir2
,這使目錄仍然存在。這類似於匿名文件。通常,當文件連結計數變為零時,會刪除文件並釋放 inode。但是,如果一個程序仍然打開文件,核心不會刪除該文件,直到該程序關閉該文件,顯式或隱式退出。在Dir2
的情況下,只要不更改其目前目錄,shell 仍然會“打開”目錄。消失的是目錄中的名稱以及它下面的整個名稱層次結構,包括和條目。以前稱為的目錄也消失了(假設沒有其他程序將其作為目前目錄)。inode 級別的文件和目錄不形成層次結構,即沒有從 inode 到父、子或兄弟條目的連結。層次結構由目錄條目單獨建構,這些條目本質上是(名稱,inode)對,指向文件和其他目錄。
Dir1``Desktop``.``..``Dir1
Dir2
在這個冗長的介紹之後,我們可以改寫你原來的問題,這樣它就變成了:“為什麼當目錄條目被刪除時,shell 不將其目前目錄更改為其他目錄Dir1
?” 嗯,一個原因是外殼甚至不知道這一點。其他一些程序已經執行了rm
程序並刪除了目錄,但是沒有任何機制可以告知 shell。其次,shell 會選擇哪個目錄作為其新的目前目錄?使用chdir
系統呼叫更改目錄,該呼叫將包含新目錄的字元串作為參數。shell 可以嘗試 achdir("..")
,但正如我們在上面看到的,我們已經銷毀了..
入口!三、shell為什麼要改變目前目錄?它沒有理由這樣做,它坐在那裡很舒服,而且它沒有在沒有被明確告知的情況下神奇地更改目錄的習慣。誠然,這種情況有點病態,但使用者可以避免這種情況。