【发布时间】:2012-07-01 05:23:48
【问题描述】:
为什么 autoconf 脚本中的条件语句在其变量前加上“x”?例如,GNU 提供的用于测试 Boost 的宏具有诸如
之类的条件if test "x$want_boost" = "xyes"; then
为什么不定义为:
if test "$want_boost" = "yes"; then
【问题讨论】:
标签: autoconf
为什么 autoconf 脚本中的条件语句在其变量前加上“x”?例如,GNU 提供的用于测试 Boost 的宏具有诸如
之类的条件if test "x$want_boost" = "xyes"; then
为什么不定义为:
if test "$want_boost" = "yes"; then
【问题讨论】:
标签: autoconf
在一些早期的 shell 中,测试空字符串变量并不像现在那么容易,所以最好的替代方法是查看“x$variable”是否等于“x”。此外,由于这显然使用了test,这比尝试正确引用/转义诸如 '$x != "y"' 之类的序列更简单,而不会失去理智和/或可移植性。
【讨论】:
test "" = "foo")的命令
$variable 扩展为以破折号开头的内容,test 可能会将其解释为选项而不是字符串进行比较。在现代 shell 中,等号优先,但并非总是如此。
在符合 POSIX 的 shell 中,
test "$foo" = "$bar"
无论变量foo 和bar 的内容是什么,都会进行字符串比较。但是在旧的、不兼容的 shell 中,如果 foo 包含以破折号开头的内容,test 会尝试将其解释为一元运算符,因此它会抛出语法错误或进行错误的测试。写x"$foo" = x"$bar" 使这成为不可能。如果任一参数扩展为空字符串,我也模糊地回忆起问题,但这可能只有在您省略双引号时才会出现(在这种情况下,现代 shell 也会出现问题)。
这在编写配置脚本时尤其重要,因为至少在原则上,无论 shell 环境有多旧,它们都应该可以工作;如果你今天在 2020 年编写一个新程序,那么你使用 C 和 autoconf 最合理的原因是你需要对一些旧系统的可移植性......
【讨论】: