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,并且其基于默认的ash
shell 比 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 的兼容性甚至更差,这实际上使它在很多方面变得更加理智。
如果您可以选择使用非 POSIX 功能编写 shell 脚本,那么您还可以选择使用Bourne shell 语言系列以外的语言编写脚本。所有这些语言都比 shell 具有更好的人体工程学,在大多数情况下要好得多(我遇到的唯一例外是 Tcl 和 csh)。
\n因此:如果您不需要可移植性\xe2\x80\x94,如果它不是相关的设计约束,这/bin/sh
是您可以确定存在于任何假装为 Unix\xe2\x80\x94 的任何东西上的唯一脚本解释器,那么就不要这样做t 编写 shell 脚本。请改用其中一种更符合人体工程学的语言。