Shell

為什麼 cd 不是程序?

  • September 9, 2017

我一直想知道為什麼cd不是程序,但從未設法找到答案。

有誰知道為什麼會這樣?

cd命令修改“目前工作目錄”,對嗎?

“目前工作目錄”是每個程序獨有的屬性。

所以,如果cd是一個程序,它會像這樣工作:

  1. cd foo
  2. cd過程開始
  3. cd程序更改cd 程序的目錄
  4. cd程序退出
  5. 您的 shell 仍然具有與您開始之前相同的狀態,包括目前工作目錄。

cd除了是一個內置的 shell,它實際上也是一個在 POSIX 兼容作業系統上的程序。它們必須為正常實用程序提供獨立的執行檔,例如cd. 例如SolarisAIX、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 辨識和執行。

引用自:https://unix.stackexchange.com/questions/38808