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

Dan*_*lan 22 gnu shell-script posix

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


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

Seth:符合 POSIX 标准的自由软件项目是否更容易移植到其他类 Unix 系统?

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

Seth:POSIX 对软件自由重要吗?

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

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

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

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

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

所以,我认为POSIX 的目标是可移植性,但是,至少根据我的经验,如果我的脚本在 bash 中工作并忽略 POSIX,那么它们会比其他方式更可移植

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

ilk*_*chu 21

也许您不需要关心是否知道只会使用某些特定的 shell,而这些 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 上的DashAsBinSh 。)

在某些情况下,执行 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 的兼容性甚至更差,这实际上使它在很多方面变得更加理智。

  • macOS 切换到“zsh”作为默认的*用户* shell。系统 shell 仍然是“bash”的一个古老版本(但主要兼容 POSIX)。 (7认同)
  • 很好的答案。实际上我默认使用 zsh,但目前我倾向于用 bash 编写脚本。 (3认同)

zwo*_*wol 7

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

\n

因此:如果您不需要可移植性\xe2\x80\x94,如果它不是相关的设计约束,这/bin/sh是您可以确定存在于任何假装为 Unix\xe2\x80\x94 的任何东西上的唯一脚本解释器,那么就不要这样做t 编写 shell 脚本。请改用其中一种更符合人体工程学的语言。

\n

  • 每天您都可以在这里阅读一些问题,这些问题可以通过一个简约的 shell 脚本来回答,该脚本包含两个通过管道连接的命令。我几乎无法想象任何语言在此类问题上具有更好的人体工程学特性。 (3认同)