将shell脚本插入Makefile时,我们必须使用双美元符号($$)来引用变量。为什么要这样做?
for number in 1 2 3 4 ; do \
echo $$number ; \
done
简而言之:配方中的变量和函数引用与 makefile 中的其他引用具有相同的语法和语义。 它们也具有相同的引号规则:如果您希望一个美元符号出现在您的配方中,则必须将其加倍('$$')。 对于像默认 shell 这样使用美元符号引入变量的 shell,重要的是要清楚自己心中要引用的变量是 make 变量(使用单个美元符号)还是 shell 变量(使用两个美元符号)。
$$
是您当前进程的PID(进程标识符)。
$ ps -ef|grep $$
user 208465 200620 0 10:30 pts/4 00:00:00 bash
$ for number in 1 2 3 4 ; do \
echo $$number ; \
done
208465number
208465number
208465number
208465number
对于此示例不直接适用——除非所示代码是通过 $(shell ...)
执行而不是一个规则:
启用二次展开后,当双美元符号出现在先决条件列表中时,make可能也会在第二个处理阶段中解释双美元符号本身。 (第一阶段:读取文件、设置变量;第二阶段:查找和调用依赖目标、执行规则)
这用于在文件后面才有目标名称的变量可用时,允许动态指定相应的依赖目标。
请参见https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html。
$(foo)
和${foo}
都是对变量foo
的有效引用。这个$
符号的特殊意义是为什么你必须写成$$
才能在文件名或命令中效果等同于单个美元符号。" - melpomene