Answers:
Greg的Wiki上有一篇关于为Dash修改bash脚本的文章,指出了很多“ bashisms”-非标准的但是bash一部分的额外功能。避免这些卑鄙的行为可以使您的脚本更适合不同的环境。这尤其可以回答您的一些问题。例如,是的,有些运算符有所不同(例如==
),但是有一个标准的Posix集应该在所有环境中都可以工作。
要更全面地阅读,您可以查看Posix标准,所有外壳都应遵守该标准。特别是“ Shell&Utilities”上的卷。
我发现比shell差异更具挑战性的是命令差异。许多Linux系统都具有GNU find
,但是如果您正在编写可移植的脚本,请不要依赖于您自己的脚本,man find
因为那里有很多带有BSD的系统,而BSD find
具有不同的功能集。如果您正在为busybox编写脚本,则会发现有完全不同的nc
s的不同版本。当我将脚本部署到不同的环境时,这些总是会让我受益的。
要获得有关良好的Shell脚本编写实践的更多信息,David Pashley的博客上也提供了很好的资源:编写强大的Bash Shell脚本
另外,请确保您已在本网站上阅读了Gilles的答案和评论。他提供了许多有关确保您使用可移植代码的提示。
在特定的外壳程序中编写外壳程序脚本意味着已安装该外壳程序。唯一的标准是拥有csh
并sh
安装在所有Unix变体上。因此,如果您希望脚本在Solaris,* BSD和GNU上运行,则必须将其编写在Bourne shell中。
但是,大多数Unix命令在不同的实现方式下具有不同的语法(ps
在Solaris,FreeBSD和GNU下进行查看),因此,根据所使用的工具,脚本可能始终无法移植。安装外壳的位置也很重要。难道/bin/bash
/usr/bin/bash
,/usr/local/bin/bash
或别的地方?
我不知道任何定义外壳的标准。看一下rc或http://192.220.96.201/es/es-usenix-winter93.html`es上的怪异的非标准外壳,但是,这些外壳似乎仍然符合一些常见的想法。