Bash

分詞是 POSIX 的一部分嗎?

  • January 28, 2021

我知道 Bash 有分詞但 zsh 沒有,而且我不熟悉其他人(csh、tcsh、ksh 等),但我想知道它是否是任何標準的一部分。

換句話說,它sh有分詞功能,還是只有 Bash 的功能?如果我想編寫一個可移植的 shell 腳本,我是否必須考慮分詞,還是其他 shell 添加的非標準內容?

隱式分詞,即在不帶引號的變數擴展($foo而不是"$foo")上分詞,是所有符合 POSIX 的 shell 所做的事情,更普遍的是所有shshell。他們還對結果執行 globbing。這就是為什麼您需要在變數替換周圍加上雙引號。命令替換也是如此。

POSIX 稱這些欄位拆分路徑名擴展

Zsh 偏離了標準的 sh 行為。它不對不帶引號的變數替換執行分詞(但它確實對不帶引號的命令替換執行分詞),並且根本不對不帶引號的替換執行萬用字元。(當然,Zsh 具有這些特性,但它們是明確的:$=foo進行分詞和$~foo進行通配。) Zsh 不是與 sh 兼容的 shell;它相當接近,但不兼容,並且減少的隱式拆分是主要偏差之一。

Zsh 有一個兼容模式(如果呼叫 zsh 執行檔,則會自動進入該模式shksh,其中它確實執行隱式分詞和萬用字元,例如 sh 等等。

Bash 和 ksh 都是 sh 兼容的 shell。Bash 確實有一些與 POSIX 不兼容的地方,但您必須深入探勘才能找到它們。在隱式拆分等重要問題上,它是兼容的。

(T)csh 是一個完全不同的 shell 家族。它的語法與 sh 大不相同。它也幾乎死了,所以不用擔心。

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