Shell

為什麼 POSIX 需要某些內置的 shell 才能有外部實現?

  • May 30, 2021

這個關於 printf 是否是 yash 的內置問題的問題中,得到了這個引用 POSIX 標準的答案

答案指出,POSIX 搜尋序列是找到所需命令的外部實現,然後,如果 shell 已將其實現為內置,則執行內置。(對於不是特殊內置外掛的內置外掛。)

為什麼 POSIX 要求在允許執行內部實現之前存在外部實現?

看起來……隨意,所以我很好奇。

這是一個“好像”的規則。

簡而言之:如果實現決定使標準外部命令也可用作內置 shell,則使用者看到的 shell 行為不應改變。

我在https://unix.stackexchange.com/a/496291/5132展示的(一方面)PD Korn、MirBSD Korn 和 Heirloom Bourne shell 的行為之間的對比;(另一方面)Z、93 Korn、Bourne Again 和 Debian Almquist shell;並且(在緊握的手上)Watanabe 貝殼突出了這一點。

對於沒有printf內置的 shell,刪除/usr/binfromPATH會呼叫printf停止工作。Watanabe shell 在其一致性模式下表現出的 POSIX 一致性行為會導致相同的結果。具有printf內置功能的 shell 的行為就像呼叫外部命令一樣。

/usr/bin而如果從 中刪除,所有不符合要求的 shell 的行為都不會改變PATH,並且它們的行為不像呼叫外部命令一樣。

該標準試圖向您保證的是,shell 可以內置各種通常的外部命令(或將它們實現為自己的 shell 函式),並且您仍然會從內置命令中獲得與您所做的相同的行為如果您調整PATH以停止找到命令,則使用外部命令。 PATH仍然是您選擇和控制可以呼叫的命令的工具。

(正如https://unix.stackexchange.com/a/448799/5132所解釋的那樣,幾年前人們通過改變 on 來選擇他們的 Unix 的個性PATH。)

有人可能會認為,無論是否可以找到命令,使命令始終有效PATH 實際上是使通常的外部命令內置的關鍵。(這就是為什麼我的 nosh 工具集在 1.38 版中剛剛獲得了一個內置printenv命令,事實上。雖然這不是一個 shell。)

但是該標準向您保證,您將看到與從其他非 shell 程序呼叫該函式時看到的正常外部命令相同的行為執行(顯然)其他程序無法找到的普通外部命令。從使用者的角度來看,一切都是自洽的,並且是控制其工作方式的工具。PATH``execvpe()``PATH``PATH

進一步閱讀

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