我在autoconf配置脚本中找到了这段代码。以下代码试图做什么?我在autoconf配置脚本中找到了这段代码下面的代码试图做什么?
if ${am_cv_autoconf_installed+:} false; then :
$as_echo_n "(cached) " >&6
else
我在autoconf配置脚本中找到了这段代码。以下代码试图做什么?我在autoconf配置脚本中找到了这段代码下面的代码试图做什么?
if ${am_cv_autoconf_installed+:} false; then :
$as_echo_n "(cached) " >&6
else
很多东西在这里。让我们分解它。
首先,语法${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"
作为参数,该参数仅被忽略,导致if
语句计算结果为true。在第二种情况下,它调用false
命令,导致if
语句评估为false。
因此,所有这些确实在检查是否定义了am_cv_autoconf_installed
。如果这只是一个普通的bash脚本,并没有要求便携性的任何特定的水平,那将是一个简单了很多,只是做的事:
if [ -n "${am_cv_autoconf_installed+x}" ]; then
然而,由于这是一个配置脚本,这是毫无疑问的用这种方式编写,以实现最大的便携不是所有的炮弹都会有-n
测试。有些甚至可能没有[ ]
语法。
其余的应该是不言自明的。如果定义了变量,则if
语句的计算结果为真(或更准确地说,它将退出状态设置为0
),从而导致$as_echo_n "(cached) " >&6
行执行。否则,它会执行else
子句中的任何操作。
我在猜测$as_echo_n
只是echo -n
的环境特定版本,这意味着它将打印“(缓存)”,没有结尾的换行符。>&6
表示输出将被重定向到文件描述符6
,这大概是在脚本的其他地方设置的(可能是日志文件或其他)。