Command
大多數發行版上預設安裝的一組 CLI 工具
在編寫 shell 腳本時,為了實現盡可能多的可移植性,可能需要嘗試並堅持使用可能已經安裝在目標系統上的命令行工具。
我們可以評估特定工具,如下例所示:
我們也可以按目標發行版進行搜尋,如下所示:
Debian 中預設安裝了哪些軟體包?$$ … $$
與一次搜尋一個命令/發行版相比,是否有任何官方或某種已建立的命令集,如果未授予,但至少很可能安裝在任何 *nix 系統上?如果我們將其範圍縮小到 Linux 會怎樣?
任何可以合理地稱為 Unix 或類 Unix 的東西都有POSIX實用程序。您通常可以假設這些實用程序存在,它們支持列出的選項,並且它們的行為與指示相同。有一些限制:
- 標記為可選的功能可能並非隨處可見。
- 最近添加的功能可能尚未隨處可見。檢查“更改歷史記錄”部分。
- 軟體有bug。任何給定的系統通常在少數極端情況下會偏離規範。有時開發人員或發行版維護者並不關心偏離規範。除了經驗之外,沒有其他方法可以發現這一點。
以下是您在許多 Linux 發行版上可能遇到的限制:
ed
並且pax
通常在預設安裝中失去。- 工作控制的角落案例往往在 ksh 之外表現得很奇怪。
如果你限制在非嵌入式 Linux,你可以做一些額外的假設。
- 大多數發行版都遵循Filesystem Hierarchy Standard,該標準要求 POSIX 之外的許多實用程序。
- 重擊可用。但
/bin/sh
可能不是 bash。- 大多數 POSIX 實用程序都是GNU coreutils實現,它提供了很多擴展。
- util-linux可用(但一些實用程序可能會被另一個具有相同名稱且可能具有不同選項的實用程序實現替換)。
在嵌入式 Linux上,shell 和實用程序通常來自BusyBox。因為 BusyBox 是為小型系統設計的,所以它故意省略了一些功能,包括 POSIX 強制要求的功能。BusyBox 有很多編譯時配置選項,因此您無法真正預測給定係統上可用的內容。如果您想最大限度地提高嵌入式 Linux 的可移植性,當您使用實用程序時,請在 BusyBox 中查看其原始碼,並避免使用條件編譯保護下的選項。如果安裝完全缺少該實用程序,這將無濟於事。