从Autotools中得到一个提示:sed
如果必须编写必须在所有地方都可以使用的东西,则坚持使用Bourne和POSIX shell的最小公分母(可能会增加)。可能存在某些系统中断,但是您可以通过重写解决这些问题。
例如,某些古老的系统在test
aka中存在扩展错误的问题[
:
if [ $foo = bar ] ; then...
因此,Autoconf的做法是用一个字符前缀用双引号将其重写,如下所示:
if [ x"$foo" = "xbar" ] ; then...
您也可以"x$foo"
在这里使用。这避免了可能$foo
是的有效选项的可能性test(1)
,并且由于[
是的别名test
,因此可能会误解表达式。解决方案是建立一种情况,其中to [
始终是未知参数的开头x
,这意味着它对[
。
(Autoconf还建议使用test
代替[
,但建议是对与M4可能发生冲突的反应,M4也在[
其语法中使用。)
awk是POSIX,因此从理论上讲,它随处可见。它甚至在Busybox中也是如此,因此awk
即使在某些限制性很强的嵌入式Linux系统中,您也可以实现。不过,我会碰到一个系统,而无需惊讶少awk
比sed
。我想这归结为复杂性:更简单的工具更有可能幸免于难。
Perl不属于任何广泛使用的标准(POSIX或其他标准)的一部分,因此,如果您事先对目标环境一无所知,则根本无法依靠它。默认情况下,未安装Perl:
- 西格温
- FreeBSD和NetBSD
- 对于某些Linux,包括Slackware,“最小”安装
- 许多主要依赖Busybox的用户领域的嵌入式Linux
Autoconf手册中有一章是有关可移植Shell编程的,对您有帮助。最后一节介绍的工具一样sed
,awk
和其他许多人。