我在autoconf配置脚本中找到了这段代码。以下代码试图做什么?
if ${am_cv_autoconf_installed+:} false; then :
$as_echo_n "(cached) " >&6
else
答案 0 :(得分:1)
这里有很多东西。让我们分解吧。
首先,语法${var+foo}
是检查变量var
是否已定义的常用习惯用法。如果定义了var
,则${var+foo}
将扩展为字符串foo
。否则,它将扩展为空字符串。
最常见的(无论如何,使用bash),此语法使用如下:
if [ -n "${var+foo}" ]; then
echo "var is defined"
else
echo "var is not defined"
fi
请注意,foo
只是任意文本。您也可以使用x
或abc
或ilovetacos
。
但是,在您的示例中,没有括号。因此,无论${am_cv_autoconf_installed+:}
扩展为(如果有的话)都将被评估为命令。事实证明,:
实际上是一个shell命令。即,它是“空命令”。除了将命令退出状态设置为0
(成功)之外,它没有任何效果。同样,false
是一个不执行任何操作的shell命令,但将退出状态设置为1
(失败)。
因此,根据是否定义了变量am_cv_autoconf_installed
,脚本将执行以下命令之一:
: false
-OR -
false
在第一种情况下,它调用带有字符串"false"
的null命令作为参数,这被简单地忽略,导致if
语句计算为true。在第二种情况下,它调用false
命令,导致if
语句评估为false。
所以这一切都是检查am_cv_autoconf_installed
是否已定义。如果这只是一个普通的bash脚本并且不需要任何特定级别的可移植性,那么这样做会简单得多:
if [ -n "${am_cv_autoconf_installed+x}" ]; then
但是,由于这是一个配置脚本,因此毫无疑问是以这种方式编写的,以实现最大的可移植性。并非所有shell都会进行-n
测试。有些人甚至可能没有[ ]
语法。
其余的应该是相当不言自明的。如果定义了变量,则if
语句的计算结果为true(或更准确地说,它将退出状态设置为0
),从而导致执行$as_echo_n "(cached) " >&6
行。否则,它会执行else
子句中的任何内容。
我猜$as_echo_n
只是echo -n
的环境特定版本,这意味着它将打印“(缓存)”而没有尾随换行符。 >&6
表示输出将被重定向到文件描述符6
,这可能是在脚本的其他地方设置的(可能是日志文件或其他一些文件)。