在编写 shell 脚本时,为了实现尽可能多的可移植性,人们可能希望尝试并坚持使用可能已安装在目标系统上的命令行工具。
我们可以评估特定的工具,如下例所示:
是否有 Unix 版本默认安装时没有 awk?
我们还可以按目标分布进行搜索,如下所示:
Debian 默认安装了哪些软件包? [...]
与一次搜索一个命令/发行版相比,是否有任何官方的或某种程度上已建立的命令集,如果没有授予,但至少很可能安装在任何 *nix 系统上?如果我们将范围缩小到 Linux 会怎么样?
答案1
任何可以合理地称为 Unix 或类 Unix 的东西都有POSIX公用事业。您通常可以假设这些实用程序存在,它们支持列出的选项,并且它们的行为如指示的那样。有一些限制:
- 标记为可选的功能可能不会随处可见。
- 最近添加的功能可能还没有出现在所有地方。检查“更改历史记录”部分。
- 软件有错误。任何给定的系统通常在一些极端情况下会偏离规范。有时开发人员或发行版维护人员并不关心偏离规范。除了经验之外,没有其他方法可以找出这一点。
以下是您在许多 Linux 发行版上可能会遇到的限制:
ed
并且pax
在默认安装中经常缺失。- 作业控制的极端情况在 ksh 之外往往表现得很奇怪。
如果你限制为非嵌入式Linux,您可以做出一些额外的假设。
- 大多数发行版遵循文件系统层次结构标准,它要求使用 POSIX 之外的许多实用程序。
- 可以使用 Bash。但
/bin/sh
可能不是bash。 - 大多数 POSIX 实用程序是GNU 核心工具实现,它提供了相当多的扩展。
- 实用程序Linux可用(但一些实用程序可能会被具有相同名称且可能具有不同选项的实用程序的另一个实现替换)。
在嵌入式Linux,外壳和实用程序通常来自忙碌盒。由于 BusyBox 面向小型系统,因此它故意省略了一些功能,包括 POSIX 强制要求的功能。 BusyBox 有很多编译时配置选项,因此您无法真正预测给定系统上可用的内容。如果您想最大限度地提高嵌入式 Linux 的可移植性,那么当您使用实用程序时,请在 BusyBox 中查看其源代码,并避免使用条件编译保护下的选项。如果安装完全缺少该实用程序,这将无济于事。