使Unix shell脚本符合POSIX标准

Pra*_*bhu 9 unix linux bash shell sh

我一直在研究一个shell脚本来自动执行某些任务.确保shell脚本在大多数平台上运行时没有任何问题的最佳方法是什么.例如,我一直使用echo -n命令将一些消息打印到屏幕而没有尾随的新行,并且该-n开关在某些ksh shell中不起作用.我被告知脚本必须符合POSIX标准.如何确保脚本符合POSIX标准.有工具吗?或者是否有一个只支持最低POSIX要求的shell?

sor*_*tar 7

POSIX

其中第一步,它给你的什么工作或不和适应症为什么,是设置家当来/bin/sh使用shellcheck网站来分析你的脚本.
例如,将此脚本粘贴到shellcheck编辑器窗口中:

#!/bin/sh
read -r a b <<<"$1"
echo $((a+b))
Run Code Online (Sandbox Code Playgroud)

得到一个指示:"在POSIX sh中,here-strings未定义".

第二步,您可以使用与POSIX兼容的shell.
一个与大多数其他简单shell兼容的shell 是破折号,Debian默认系统shell,它是旧BSD灰的衍生物.

与posix兼容的另一个外壳是豪华的.

但是,破折号和/或豪华版可能无法用于某些系统.

有lksh(具有ksh风格),目标是与传统(旧)shell脚本兼容.从其手册:

lksh是一个专门用于运行旧shell脚本的命令解释器.

但是在调用lksh时需要使用选项,比如-o posix-o sh:

请注意,强烈建议至少使用-o posix选项调用lksh,如果不是和-o sh,则完全享受与POSIX标准的更好兼容性(这可能就是为什么你首先使用lksh而不是mksh)或旧版脚本.

你会打电话lksh -o posix -o sh而不是简单lksh.

使用选项是一种使其他shell与POSIX兼容的方法.像lksh一样,使用选项-o posix,比如bash -o posix.

在bash中,甚至可以在脚本中打开POSIX选项,其中包括:

shopt -o posix            # also with: set -o posix
Run Code Online (Sandbox Code Playgroud)

也可以创建一个本地链接,bash或者zsh使它们都像旧shshell一样.像这样:

$ ln -s /bin/bash ./sh
$ ./sh
Run Code Online (Sandbox Code Playgroud)

有很多替代方案(破折号,豪华版,lksh,bash,zsh等)来获得一个可以用作POSIX shell的shell.

手提

然而,即便如此,以上所有都不能确保"便携性".

不幸的是,使shell脚本"符合POSIX"通常比在任何真实的shell上运行更容易.

唯一真实世界的明智建议是在几个shell中测试你的脚本.
像上面的列表:dash,posh,lksh和bash --posix.

Solaris本身就是一个世界,可能你需要针对/ bin/sh和xpg4/sh进行测试.

跟进:

如何测试shell脚本的POSIX合规性?


Nin*_*den 1

使用 --posix 命令行选项启动 Bash 或在 Bash 运行时执行 \xe2\x80\x98set -o posix\xe2\x80\x99 将导致 Bash 通过更改行为以匹配该标准,从而更符合 POSIX 标准由 POSIX 在 Bash 默认值不同的区域中指定。

\n\n

参考

\n

  • 这很有帮助,但关键短语是_更密切_:即使 Bash 在 POSIX 兼容模式下运行,许多 Bashism 仍然可用(例如,“[[ ... ]]”条件、“&lt;&lt;&lt;...”(此处为字符串) ,...),因此这本身并不能告诉您脚本是否符合 POSIX 标准。换句话说:虽然将 Bash 与 `--posix`、`set -o posix` 或将其调用为 `sh` 消除了与 POSIX 规范的一些完全不兼容,但它仍然允许许多特定于 Bash 的扩展,这些扩展将与大多数 POSIX 功能仅包含诸如“dash”之类的 shell。 (6认同)