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