每当我编写shell脚本(主要是软件开发实用程序或构建工具)时,我一般都试图避免使用bash而支持使用普通旧的sh来实现可移植性。然而,最近我遇到了越来越多的问题,其中有用的功能不可用,或者行为在使用sh的系统中实际上不那么一致然后它使用bash,因为sh是别名到不同的shell ...
据我了解,sh是最古老的Unix shell,并且在理论上运行时,经过精心编写的sh脚本几乎可以在任何系统上运行......但似乎每个主要shell也有大约9000种不同的变体。不使用bash作为脚本解释器有效地限制了脚本的可移植性?当然,OS X上没有问题,或者几乎没有任何Linux问题,但BSD呢? Solaris,AIX,HP-UX?如果你真的想要在所有事情上运行,你会怎么做?
我知道bash几乎可以安装在任何操作系统上,但它真的是所有相关现代系统的一等公民?它是预安装的吗?我只是不确定是否最好避免或接受bash,以达到最一致和最便携的整体体验。
答案 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)
只要它在您的路径中,您始终可以使用该行编写脚本代码。
#!/usr/bin/env bash