由于有不同种类的 shell,bash 和 shell 脚本之间有什么区别?是否有可以编写在所有 unix shell 上运行的兼容脚本
答案1
脚本bash
是由 Bourne-Again SHell 解释的脚本,因此是 shell 脚本。它可能会也可能不会被其他 shell 成功执行。如果您使用bash
特定语法,则无法确定它是否可以与其他 shell 一起运行。
如果你想编写一个可以被每个 shell 解释的脚本,你必须使用 POSIX 标准中描述的语法:外壳命令语言。当然不是全部shell 遵循 POSIX 标准,但这是您能做的最好的事情。此类脚本非常可移植,并且可以以相同的方式在许多 Linux 和 *nix 上运行,而不会引发错误。
许多 shell 和命令行工具都会查找名为 的环境变量$POSIXLY_CORRECT
。如果设置了,这些工具的行为就像符合 posix 的工具的行为一样。
另一种尝试是--posix
旗帜。例如,GNUsed
有一个名为 的标志,--posix
它禁用所有 GNU 扩展,sed
其行为类似于 posix sed
。
bash
支持--posix
和$POSIXLY_CORRECT
变量。
如果您以这种方式编写脚本并使用 posix 兼容的 shell 测试它们,那么您就处于最佳状态。
答案2
Bash 是 Bourne Shell 和 ksh88(部分也是 ksh93)功能克隆的混合体。
今天的“壳牌”是一个太不精确的术语......
Bash 脚本是利用供应商独特的bash
实现功能的脚本。
如果您喜欢编写可移植脚本,有两种方法:
1) 编写符合 POSIX 标准的脚本,但随后您需要知道如何在所有平台上调用 POSIX shell。请注意,您不会通过调用 来获得 POSIX shell /bin/sh
。您宁愿需要将 PATH 设置为getconf PATH
then 调用的输出sh
而不使用 PATH - 您会发现这对于已安装的脚本没有用......
2) 编写与 Bourne Shell 兼容的脚本。这些脚本几乎可以与任何(基本上是基于 Bourne Shell 的)shell 配合使用。因此,将自己限制在最少的功能集和约束假设上。
如果您想检查脚本的可移植性,我建议您使用 SYSVr4 Bourne Shell 实现来检查脚本。 SVr4 Bourne Shell 的便携式版本位于 Schily Tools tarball 中:
http://sourceforge.net/projects/schilytools/files/
编译并检查名为 的二进制文件osh
。这是便携式 SVr4 Bourne Shell。