为什么 autoconf 脚本中的条件语句在其变量前加上“x”?例如,GNU 提供的用于测试 Boost 的宏具有条件,例如
if test "x$want_boost" = "xyes"; then
为什么这没有被定义为:
if test "$want_boost" = "yes"; then
为什么 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 的 shell 中,
test "$foo" = "$bar"
无论变量的内容是什么,都会进行字符串foo
比较bar
。但是在旧的、不兼容的 shell 中,如果foo
包含以破折号开头的内容,test
则会尝试将其解释为一元运算符,因此它要么抛出语法错误,要么进行错误的测试。写作x"$foo" = x"$bar"
使这成为不可能。如果任一参数扩展为空字符串,我也模糊地回忆起问题,但这可能只有在您省略双引号时才会出现(在这种情况下,现代 shell 也会出现问题)。
这在编写配置脚本时尤其重要,因为至少在原则上,无论 shell 环境有多旧,它们都应该工作;如果您今天在 2020 年编写一个新程序,那么您使用 C 和 autoconf 最合理的原因是您需要对某些旧系统具有可移植性……