Linux
什麼不是外殼特定的?
在某些答案下,我看到建議在答案中避免使用特定於 shell 的命令的評論。
我如何知道所有 shell 中存在哪些命令、運算符等?有標準清單嗎?
man builtins
給出命令列表。這些是我可以在適用於所有 shell 的可移植 shell 腳本中使用的唯一命令嗎?- 內置可以是特定於外殼的嗎?
- Linux 的標準與其他 Unix 的標準是否不同?
- 語法呢?標點符號、運算符等在某些 shell 中可以不同嗎?
Greg 的 Wiki有一篇關於為 Dash 調整 bash 腳本的文章,其中指出了許多“bashisms”——非標準但屬於 bash 一部分的額外功能。避免這些 bashism 有助於使您的腳本對不同的環境更友好。這特別回答了你的一些問題。例如,是的,有一些不同的運算符(如
==
),但有一個標準的 Posix 集應該適用於所有環境。如需更深入的閱讀,您可以查看所有 shell 都應遵守的Posix 標準。特別是“Shell & Utilities”一卷。
我發現比 shell 差異更具挑戰性的是命令差異。許多 Linux 系統都有 GNU
find
,但是如果你正在編寫一個可移植的腳本,不要依賴你自己的man find
,因為那裡有很多帶有 BSD 的系統find
,它具有不同的功能集。如果您正在為busybox 編寫腳本,您會發現不同版本nc
的s 完全不同。當我將腳本部署到不同的環境時,這些都是我經常遇到的事情。有關良好的 shell 腳本實踐的額外閱讀,在 David Pashley 的部落格上也有一個很好的資源:Writing Robust Bash Shell Scripts
另外,請確保您閱讀了Gilles在本網站上的回答和評論。他有很多關於確保您使用可移植程式碼的技巧。