bash脚本和shell脚本有什么区别

bash脚本和shell脚本有什么区别

由于有不同种类的 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 PATHthen 调用的输出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。

相关内容