单或双支架和便携性

Jet*_*ohn 4 bash standard shell-script posix portability

我在这里找到了一些关于“if”语句之间[[[“if”语句之间差异的非常好的答案。对于特定命名的 shell,使用[[over似乎是个好主意[(而且速度也更快)。

但是,我仍然不清楚可移植性。如果我的目标是为 POSIX 兼容 shell 编写脚本,我将从脚本开始#!/bin/sh,那么这种语法是如何允许的。从我读过的内容来看,双括号不在 POSIX 标准中,但在“现实世界”中,这真的有多大问题?

我想我的意思是我想要一个可移植的脚本,但它足以在所有可行的 POSIX shell 上工作,比如 2000-2005。意思是,它不是标准的一部分,是的,但实际上,从 2005 年开始的任何 shell 几乎肯定会接受该语法。

此外,还有一个关于脚本可移植性和 POSIX 的更普遍的问题:其他作者如何处理这个问题?我了解用例和目标受众决定了大部分决策,但是您是否尝试尽可能接近 POSIX 以减少整个 Internet 可能存在的不兼容性,或者您是否利用了大多数 shell 的所有优点?尚未接近 POSIX 标准的支持?

我首先尝试使我的大部分脚本尽可能符合 Bourne 和 POSIX。然而,随着时间的推移,通过阅读更多的 Bash 文档和在网上看到其他人的脚本,我不得不说,利用这些其他功能可以使脚本更容易阅读,并且在许多情况下更小。

Mic*_*mer 7

如果我的目标是为 POSIX 兼容 shell 编写脚本,我将以 #!/bin/sh 开头的脚本,那么这种[[语法是多么允许。

一点也不。许多基于 Linux 的现代系统默认使用dashas /bin/sh,它完全符合 POSIX 标准,仅此而已,因此[[无法正常工作。这包括最近的每个DebianUbuntu版本及其衍生版本,以及许多其他发行版。从历史上看,这些系统通常在那里使用 Bash,并故意切换以提高性能。

许多其他系统,包括大多数 BSD 和大多数商业 Unices,[[两者都不支持,也从未支持:它们sh仅支持POSIX,或者其扩展不包含[[语法。OpenBSD系统sh不支持的版本[[,这是比bash的略有不同; 我不知道还有其他人这样做,尽管它们可能存在。否则,只有将 Bash 用作/bin/sh(或较少使用zsh,甚至较少使用其他一些)的系统[[才能在声明为sh脚本的内容中工作。


另一方面,大多数系统在实践中都安装了 Bash,只需明确地运行你的脚本bash就足够了。sh无论如何,Bash 的-emulation 模式总是被打破。

由于您依赖 Bash 功能,因此我完全看不出您有任何理由要将其声明为sh脚本:说到#!/bin/bash做到,[[想用多少就用多少——甚至更好,完全排除的[。如果您想要最大的可移植性,请使用[ortest和 POSIX sh1,并仔细编写。

1请注意,一些商业 Unices 已经或曾经拥有非 POSIXsh作为/bin/sh; 要统一处理那些您需要使用系统 POSIX 的完整路径运行脚本的脚本sh