為什麼 cd 不是程序?
我一直想知道為什麼
cd
不是程序,但從未設法找到答案。有誰知道為什麼會這樣?
該
cd
命令修改“目前工作目錄”,對嗎?“目前工作目錄”是每個程序獨有的屬性。
所以,如果
cd
是一個程序,它會像這樣工作:
cd foo
- 該
cd
過程開始- 該
cd
程序更改cd 程序的目錄cd
程序退出- 您的 shell 仍然具有與您開始之前相同的狀態,包括目前工作目錄。
cd
除了是一個內置的 shell,它實際上也是一個在 POSIX 兼容作業系統上的程序。它們必須為正常實用程序提供獨立的執行檔,例如cd
. 例如Solaris、AIX、HP-UX 和OS X就是這種情況。顯然,內置
cd
的仍然是強制性的,因為它的外部實現不會改變目前的 shell 目錄。但是,後者仍然有用。這是一個範例,展示了 POSIX 如何設想如何cd
使用此命令:find . -type d -exec cd {} \;
在 POSIX 系統上,此 oneliner 將報告您不允許進入的所有目錄的錯誤消息
cd
。在大多數 Gnu/Linux 發行版上,它會失敗並顯示該錯誤消息:find: `cd': No such file or directory
這是您的問題的答案,“為什麼 cd 不是程序? ”由原始 Unix 合著者之一。在一個非常早期的 Unix 實現中, (當時
cd
拼寫)是一個外部程序。它只是在首次實施chdir
後意外停止工作。fork
引用**丹尼斯·里奇的話**:
在我們歡呼雀躍的時候,發現 chdir(更改目前目錄)命令已經停止工作。對於添加 fork 可能如何破壞 chdir 呼叫,有很多程式碼閱讀和焦慮自省。終於真相大白了:在舊系統中 chdir 是一個普通的命令;它調整了附加到終端的(唯一)程序的目前目錄。在新系統下,chdir 命令正確地更改了為執行它而創建的程序的目前目錄,但該程序立即終止,對其父 shell 沒有任何影響!有必要使 chdir 成為一個特殊的命令,在 shell 內部執行。事實證明,幾個類似命令的函式具有相同的屬性,例如登錄。
資料來源: Dennis M. Ritchie,“ Unix 分時系統的演變”,AT&T 貝爾實驗室技術期刊 63(6),第 2 部分,1984 年 10 月,第 1577-93 頁
Unix 版本 1(1971 年 3 月)chdir手冊頁狀態:
因為創建了一個新程序來執行每個命令,所以如果將 chdir 作為普通命令編寫,它將無效。因此,它被 Shell 辨識和執行。