Unix shell之间的可移植性 - 我是否正确地考虑了这个问题?

时间:2012-06-19 06:24:30

标签: bash shell cross-platform portability sh

每当我编写shell脚本(主要是软件开发实用程序或构建工具)时,我一般都试图避免使用bash而支持使用普通旧的sh来实现可移植性。然而,最近我遇到了越来越多的问题,其中有用的功能不可用,或者行为在使用sh的系统中实际上不那么一致然后它使用bash,因为sh是别名到不同的shell ...

据我了解,sh是最古老的Unix shell,并且在理论上运行时,经过精心编写的sh脚本几乎可以在任何系统上运行......但似乎每个主要shell也有大约9000种不同的变体。不使用bash作为脚本解释器有效地限制了脚本的可移植性?当然,OS X上没有问题,或者几乎没有任何Linux问题,但BSD呢? Solaris,AIX,HP-UX?如果你真的想要在所有事情上运行,你会怎么做?

我知道bash几乎可以安装在任何操作系统上,但它真的是所有相关现代系统的一等公民?它是预安装的吗?我只是不确定是否最好避免或接受bash,以达到最一致和最便携的整体体验。

3 个答案:

答案 0 :(得分:2)

  

如果你真的想要在所有事情上运行,你会怎么做?

您遵循POSIX standard for sh(以及您正在调用的工具)并希望目标操作系统也这样做。任何名为“UNIX”的现代产品都必须遵循此标准,并且通常(尽管不是普遍的)标准shell将被称为/bin/sh。 BSD和Linux发行版也倾向于以POSIX兼容性为目标。

答案 1 :(得分:2)

  

不使用bash作为脚本解释器有效地限制了脚本的可移植性吗?

是的,但这取决于您所指出的目标受众。如果它是一个简短的脚本,那么值得在dash(Ubuntu和Debian的默认shell)下测试POSIX兼容性。

每当我开始考虑shell脚本中的可移植性问题时,我就会切换到另一种语言。 Perl是广泛可用的,通常是脚本的一个很好的选择,但是如果你的工具要被Python,Ruby,$ lang开发人员使用,那么就可以充分利用$ lang。

答案 2 :(得分:0)

bash本身只是一个简单的C程序,不需要特殊的权限来运行,可以放在任何位置。您可以从源代码轻松构建它。基本上,如果需要,您可以运行bash,并且不需要系统管理员来安装它。

只要它在您的路径中,您始终可以使用该行编写脚本代码。

#!/usr/bin/env bash