在bash/Makefile中,双美元符号的含义是什么?

68

将shell脚本插入Makefile时,我们必须使用双美元符号($$)来引用变量。为什么要这样做?

for number in 1 2 3 4 ; do \
    echo $$number ; \
done
3个回答

95
根据 gnu make 官方文档 的说明:

配方中的变量和函数引用与 makefile 中的其他引用具有相同的语法和语义。 它们也具有相同的引号规则:如果您希望一个美元符号出现在您的配方中,则必须将其加倍('$$')。 对于像默认 shell 这样使用美元符号引入变量的 shell,重要的是要清楚自己心中要引用的变量是 make 变量(使用单个美元符号)还是 shell 变量(使用两个美元符号)。

简而言之:
  • makefile 变量 => 使用单个美元符号
  • shell 变量 => 使用两个美元符号

9
关于变量的语法的说明:"要替换变量的值,请先写一个美元符号,然后在括号或花括号中写上变量的名称:$(foo)${foo} 都是对变量 foo 的有效引用。这个 $ 符号的特殊意义是为什么你必须写成 $$ 才能在文件名或命令中效果等同于单个美元符号。" - melpomene

11

$$是您当前进程的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

2
这并没有回答问题,问题具体是关于Makefile中的shell脚本。 - gsgx
虽然这段代码片段可能是解决方案,但包括解释真的有助于提高您的帖子质量。请记住,您正在回答未来读者的问题,而这些人可能不知道您的代码建议原因。 - Shawn Hemelstrand

3

对于此示例不直接适用——除非所示代码是通过 $(shell ...) 执行而不是一个规则:

启用二次展开后,当双美元符号出现在先决条件列表中时,make可能也会在第二个处理阶段中解释双美元符号本身。 (第一阶段:读取文件、设置变量;第二阶段:查找和调用依赖目标、执行规则)

这用于在文件后面才有目标名称的变量可用时,允许动态指定相应的依赖目标。

请参见https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接