POSIX
第一步,它可以告诉您什么有效或无效以及为什么,将 shebang 设置为 /bin/sh 和 use shellcheck site 以分析您的脚本。
例如,将此脚本粘贴到 shellcheck 编辑器窗口中:
#!/bin/sh
read -r a b <<<"$1"
echo $((a+b))
得到一个指示:“在 POSIX sh 中,这里的字符串是未定义的”。
作为第二步,您可以使用与 POSIX 尽可能兼容的 shell。
一种与大多数其他简单 shell 兼容的 shell,is dash,Debian 默认系统 shell,它是旧 BSD ash 的衍生版本。
另一个与 posix 兼容的 shell 是 posh。
但是,dash 和/或 posh 可能不适用于某些系统。
有 lksh(具有 ksh 风格),其目标是与遗留(旧)shell 脚本兼容。来自其手册:
lksh 是专门用于运行旧版 shell 脚本的命令解释器。
但是调用lksh的时候需要用到options,比如-o posix和-o sh:
请注意,强烈建议至少使用 -o posix 选项调用 lksh,如果不是同时使用该选项和 -o sh,以充分享受与 POSIX 标准的更好兼容性(这可能是您在第一名)或旧版脚本。
您应该调用lksh -o posix -o sh 而不是简单的lksh。
使用选项是使其他 shell 兼容 POSIX 的一种方法。和 lksh 一样,使用选项-o posix,比如bash -o posix。
在 bash 中,甚至可以在脚本中打开 POSIX 选项,使用:
shopt -o posix # also with: set -o posix
也可以创建到bash 或zsh 的本地链接,这使得两者都像旧的sh shell。像这样:
$ ln -s /bin/bash ./sh
$ ./sh
有很多替代方案(dash、posh、lksh、bash、zsh 等)可以获得一个可以作为 POSIX shell 工作的 shell。
便携
然而,即便如此,以上所有内容并不能保证“可移植性”。
不幸的是,让 shell 脚本“符合 POSIX”通常比让它在任何真实世界的 shell 上运行更容易。
现实世界中唯一明智的建议是在多个 shell 中测试您的脚本。
如上面的列表:dash、posh、lksh 和 bash --posix。
Solaris 是一个独立的世界,您可能需要针对 /bin/sh 和 xpg4/sh 进行测试。
跟进:
How can I test for POSIX compliance for shell scripts?