如果我正在编写 bash 脚本,为什么要关心 POSIX?

如果我正在编写 bash 脚本,为什么要关心 POSIX?

寻找我可以对此问题提出的建议/编辑以重新打开它。其中很多答案对我来说似乎都是客观的,它们正是我正在寻找的答案类型。


我读过四篇有关 POSIX 的文章,但未能找到答案。现在我知道什么是 POSIX,我已经知道标准是什么,但我仍然不确定为什么 POSIX 标准今天仍然具有相关性。我读过的三篇文章之一是理查德·斯托曼的采访。在其中,他说

赛斯: POSIX 兼容的自由软件项目是否更容易移植到其他类 Unix 系统?

有效值:我想是这样,但我在 20 世纪 80 年代决定不再把时间花在将软件移植到 GNU 以外的系统上。 ...

赛斯: POSIX 对软件自由重要吗?

有效值: 从根本上来说,没有什么区别。然而,标准化……帮助我们更快地迈向……自由软件。这是在 20 世纪 90 年代初实现的...[强调我的]

他的答案带有 GNU 观点的色彩,但他似乎是在回答我的问题,“POSIX 不再相关”?

以下是更具体的内容来解释为什么我首先对此感兴趣:在这个答案中,我建议使用进程重定向<(command)。回复称:“不幸的是,进程重定向是一项非 POSIX 功能,因此并非所有机器都支持它。”

我想我假设脚本以#!/bin/bash.既然进程重定向是 bash 的一项功能,那么这是否意味着任何带有 bash 的系统都是可移植的?根据维基百科,bash“已被用作大多数 Linux 发行版的默认登录 shell。”

然而,这篇文章说,“目前,由于成本高昂,Linux 尚未获得 POSIX 认证,除了两个商业 Linux 发行版浪潮 K-UX [12] 和华为 EulerOS [6]。相反,Linux 被视为大部分符合 POSIX 标准。”

所以我思考POSIX 的目标是可移植性,但是,至少根据我的经验,我的脚本将是更多的如果他们在 bash 中工作并忽略 POSIX,那么是可移植的,而不是相反。

重申我的问题,为什么编剧是否应该花时间关注 POSIX 合规性?

答案1

也许你不需要关心你是否知道您只会使用某些特定的 shell,而不仅仅限于 POSIX 功能。

但是,您仍然有可能最终不得不使用其他东西,在这种情况下,了解非标准功能可能会有所帮助。也许您一生都在 Linux 上工作,但是一个新的 $DAYJOB 让您进入了某个完全不同的系统的外壳。

但这并不是说它只是非 Linux 系统。嵌入式/小型系统可能只有 Busybox,并且其基于默认的ashshell 比 Bash 更接近普通的 POSIX sh。 (Busybox 还有另一个 shell,hush我不太熟悉。我也怀疑它是 Bash 克隆。无论如何,在小型系统上,通常需要较小的 shell,这很可能意味着功能较少。)此外, Debian(以及 Ubuntu)也非常关心:由于 Bash 相当慢,并且在 systemd 出现之前,shell 脚本被大量用于系统启动,因此它们更改了默认值/bin/sh为 Dash,这是另一种基于 ash 的 shell。 (参见例如LWN 的一篇相关文章达世币在 Ubuntu 的 wiki 上。)

在某些情况下,执行 POSIX 操作不需要任何成本,因为功能是相同的。我承认,我能想到的很简单,例如使用[ a = b ]代替[ a == b ],或i=$((i + 1))代替((i++))。无论如何,这样的情况确实存在,尤其是。使用==似乎很常见,没有任何好处。 (虽然[[ .. ]]vs.[ .. ]有点不同,但它们有实际的区别。)

这并不是说永远不应该使用局部变量、数组、进程替换以及字符串替换和切片扩展!恰恰相反,我认为他们是非常需要时有用。只是意识到它们并不是在世界上的每个 shell 中都能工作是有帮助的。或者更糟糕的是,它们的工作方式并不相同。

话虽如此,如果我们考虑 unix.SE 上的答案,应该注意的是,该网站标题显示“Unix & Linux”,并且它被称为unix.stackexchange.com,而不是linux.stackexchange.com,因此记住非 Linux 系统是有一定相关性的。而且,我猜很多长期用户都是这样的学究。 ;)

如果您愿意离开 POSIX 链并依赖 Bash,您可能还想考虑使用 zsh。它与 POSIX 的兼容性甚至更差,这实际上使它在很多方面变得更加理智。

答案2

如果您可以选择使用非 POSIX 功能编写 shell 脚本,那么您还可以选择使用某种语言编写脚本以外Bourne shell 语言家族。在大多数情况下,所有这些语言都比 shell 具有更好的人体工程学特性很多更好的人体工程学(我遇到过的唯一例外是 Tcl 和 csh)。

因此:如果您不需要可移植性——如果这不是相关的设计约束/bin/sh是您可以使用的唯一脚本解释器当然存在于任何假装是 Unix 的东西上——那么不要写 shell 脚本。请改用其中一种更符合人体工程学的语言。

答案3

我不得不承认,我在编写 bash 脚本时从未想到过 POSIX;我希望在编写 bash 代码时考虑(或不考虑)这一点;您的 bash 脚本应该可以在任何支持 bash 的系统上运行。

根据我的经验,POSIX 在用 C 或 C++(或其他编译语言)编写可移植代码时非常有帮助;您甚至可以在 Windows 中找到 POSIX 兼容的库。或者你可以在 20 年前,他们可能已经删除了它们,但我记得为了让某些东西与 C++ 中的 Windows 函数一起工作而进行了一场无望的战斗,但当我开始使用 POSIX 函数时,它就起作用了。

当涉及到解释性语言时,例如 Java、Python 或 bash,它们已经被移植到许多不同的平台,因此您的代码应该可以在所有这些平台上运行,除了 Windows 路径名等特性之外。

相关内容