![我认为 Linux 是 POSIX 兼容的,但找不到一些 POSIX 命令](https://linux22.com/image/195774/%E6%88%91%E8%AE%A4%E4%B8%BA%20Linux%20%E6%98%AF%20POSIX%20%E5%85%BC%E5%AE%B9%E7%9A%84%EF%BC%8C%E4%BD%86%E6%89%BE%E4%B8%8D%E5%88%B0%E4%B8%80%E4%BA%9B%20POSIX%20%E5%91%BD%E4%BB%A4%20.png)
我想为 Linux 和其他 UNIX 系统(可能是 OSX)编写一个小型 shell 脚本。而且,为什么不原则上保持平台无关,对吧?
所以我使用了#!/bin/sh
shebang,我的脚本的一部分应该压缩字符串,所以我想我只是看看它是压缩字符串或流的 POSIX 默认实用程序。不出所料,两者tar
都gzip
没有被列出https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html。但我没想到的是:列出的内容compress
并没有安装在我的 Debian 11 Bullseye 系统上!
所以我什至不能依赖所有所谓的 POSIX 兼容系统上可用的 POSIX 命令?我是不是在某个地方犯了错误?
答案1
我已经做了很多跨平台工具,实际上有两件事是你需要关心的:
- 核心逻辑/语言应该符合 posix,工作正常,避免 bashisms、zsh'isms 等。这就是 POSIX 合规性很重要的地方,而且很容易实现。这在子 shell 代码中变得尤为重要。
- 使用核心 POSIX sh 逻辑作为包装器来测试、检测然后使用执行操作所需的工具。从最可能出现的位置到最不可能出现的位置。我认为我从未在理论上“它应该在那里,因为 POSIX 是这么说的”编码上花费过任何时间或精力,我总是只是测试和使用那里的东西。当然,它添加了一些代码行,但如果您的目标是始终处理所有事情,那么您就可以这样做。
关于“压缩”工具,我可以诚实地说,在这个线程之前我什至从未听说过它,从上面的评论来看,难怪我为什么要拥有它,因为它不如总是安装的现代工具,或者说可以轻松安装吗?
如果你遇到任何复杂的事情,你的逻辑随时随地工作的可能性就会迅速下降,除非你能在基础层面上让它变得非常简单。直说吧,是的,这总是有效的,但一旦你添加了工具,就不那么有效了。例如,您甚至不能指望系统上的“awk”是基本 awk,它可能是链接到 awk 的 nawk 或 gawk。
如果不测试工具,您会感到悲伤,并且您将无法成功创建真正跨平台/跨操作系统/跨发行版的东西。
话虽如此,您仍然会发现无法正常工作的系统,然后您必须更新工具,通过添加更多测试和后备措施来使这种情况正常工作,事情就是这样。我刚刚为我以前从未见过的新情况添加了一些内容。
这并不难,除非你试图维护一个标准,例如 GNU/Linux 在许多级别上几乎不再遵循的标准(systemd?不?,好吧,那么,让我们继续前进)应该做你想要相信它应该做的事情如果没有,那只会导致你浪费时间和毫无意义的挫败感。
请注意,如果您尝试使用重要的工具,这会变得更加困难,因为此时您根本无法依赖任何操作系统,您必须测试并处理每个变体,例如,每个 BSD 都为自己不这样做而感到自豪使用软件包的分发版,但操作系统包含自己的核心工具,这意味着,即使工具在每个变体/操作系统中具有相同的名称,您也永远不能依赖跨平台的相同输出或操作。例如,ps 在 OpenBSD、FreeBSD、Linux 甚至 busybox 上有显着不同,例如您可能会在 wrt 固件上找到它。
答案2
虽然 Linux 可能(几乎 100%)兼容 POSIX,但任何发行商都可以决定默认安装什么软件包(您在安装过程中也可以)。为什么不compress
使用包管理器安装在您漂亮的 Debian 系统中呢?
# sudo apt install ncompress
基本上,与更现代的算法(例如和compress
)相比,压缩非常严重,以至于没有人再使用它。分销商可能会选择默认不安装该程序。bzip2
xz
也可以看看本公告关于 Debian 的 POSIX 合规性。