为什么autoconf脚本中的条件语句将其变量用“x”作为前缀?例如,GNU提供的用于测试Boost的宏具有诸如
之类的条件if test "x$want_boost" = "xyes"; then
为什么这不定义为:
if test "$want_boost" = "yes"; then
答案 0 :(得分:8)
在一些早期的shell中,测试空字符串变量并不像现在这么简单,所以最好的选择是看“x $ variable”是否等于“x”。此外,由于显然使用test
,这比尝试正确引用/转义'$ x!=“y”'等序列更简单,而不会失去理智和/或可移植性。
答案 1 :(得分:0)
在符合POSIX的外壳中,
test "$foo" = "$bar"
进行字符串比较,而不管变量foo
和bar
的内容如何。但是在不兼容的旧Shell中,如果foo
包含以破折号开头的内容,则test
会尝试将其解释为一元运算符,因此它将抛出语法错误或进行错误的测试。编写x"$foo" = x"$bar"
使其不可能。我还隐约记得如果任何一个参数都扩展为空字符串时会出现问题,但是只有在您省略双引号的情况下才可能出现问题(在这种情况下,现代shell也会出现问题)。
这在编写配置脚本时特别重要,因为至少在原则上,无论shell环境有多旧,它们都应该起作用。如果您要在2020年编写新程序,那么使用C和autoconf的最合理的理由是您需要可移植到某些旧系统...