autotools - Autotools:$VAR、$(VAR) 和 ${VAR} 和 ${CC-cc} 与 ${CC} 的区别
问题描述
我看到 $CFLAGS 和 ${CFLAGS} 都在使用,configure.ac 使用 $CFLAGS,acinclude.m4 使用 ${CFLAGS}。因此变量的访问方式不同:$VAR、$(VAR) 和/或 ${VAR}。
我相信 $(VAR) 和 ${VAR} 是相同的东西,这真的取决于偏好。但是 $VAR 与 $(VAR)/${VAR} 相比,使用括号有什么区别?
同样使用这段代码:${CC-cc},当我显示变量的内容时,我得到“gcc”。如果我取出“-cc”并只显示 ${CC} 的内容,我仍然会得到“gcc”。
那么连字符在这里实际上做了什么?
解决方案
我看到 $CFLAGS 和 ${CFLAGS} 都在使用,configure.ac 使用 $CFLAGS,acinclude.m4 使用 ${CFLAGS}。因此变量的访问方式不同:$VAR、$(VAR) 和/或 ${VAR}。
是和不是。
configure.ac
, acinclude.m4
, 和其他用于构建configure
脚本的 M4 源包含 shell 代码和 Autoconf 宏的混合,其中包含一些 M4 语法。shell 和 M4 都使用该$
字符来引入变量引用,但你是什么看到的可能主要是shell变量引用。对于 shell,$VAR
作为一个完整的句法单元,与 ; 的含义相同${VAR}
。两者都执行“参数扩展”。大括号可用于从其上下文中设置变量名称,例如 in ${VAR}foo
,以指示变量名称是VAR
,而不是VARfoo
。此外,当使用某些特殊的参数扩展功能时,需要使用大括号。
我相信 $(VAR) 和 ${VAR} 是相同的东西,这真的取决于偏好。但是 $VAR 与 $(VAR)/${VAR} 相比,使用括号有什么区别?
这取决于上下文。 $(VAR)
意味着与 shell 完全不同的东西${VAR}
:它扩展为通过运行 (literal) command 获得的输出(如果有)VAR
。您不会${VAR}
在 Autoconf 代码中看到它与它互换使用。但您可能会在Makefile
s 和 AutomakeMakefile.am
文件中看到它。这是因为make
使用与 shell不同的变量扩展规则。对它来说,$(VAR)
并且${VAR}
确实意味着同样的事情——它们扩展到变量的值VAR
——但$VAR
意味着完全不同的东西(并且可能是一个错误)。带括号的形式更为传统,但带花括号的形式现在也被广泛使用。
同样使用这段代码:${CC-cc},当我显示变量的内容时,我得到“gcc”。如果我取出“-cc”并只显示 ${CC} 的内容,我仍然会得到“gcc”。
那么连字符在这里实际上做了什么?
这是shell参数扩展语法的特殊功能之一(因此它适用于Autoconf代码,但不适用于Automake代码):${CC-cc}
扩展为变量的值,与设置CC
相同${CC}
,但如果未设置则扩展为文字文本。CC
CC
${CC-cc}
cc
推荐阅读
- javascript - 我可以在 TypeScript 中只使用 null(而不是 undefined)吗?
- testing - 如何使用@BeforeClass 使方法运行多次?
- mysql - MySQL 8 更新、设置、案例
- html - 左边为零的嵌套粘性元素不粘性
- reactjs - React / Ant Design - 无法上传 XLSX
- dart - 未找到方向性小部件。InkWell 小部件需要 Directionality 小部件祖先
- pip - 升级所有过时的 pip 包丢弃失败
- django - 带有 django-decouple 的 Celery 和 .env 文件
- javascript - Javascript:“ReferenceError:未定义图标”
- node.js - Firebase Functions npm install 总是卡住