这是一个在我的bash shell中工作正常的简单命令:
echo "Created at: $(date)" >> README.md
它将Created at: Wed Jan 24 10:04:48 STD 2018
附加到README.md。
但是,我在makefile中包含相同的命令,行为不同。
生成文件:
README.md:
echo "Created at: $(date)" >> README.md
运行make README.md
会将命令替换视为空字符串,如下所示:
echo "Created at: " >> README.md
附加到README.md的内容是Created at:
。
如何在makefile中使用echo正确输出命令替换?
答案 0 :(得分:2)
如果您希望Make调用的shell接收以下内容:
echo "Created at: $(date)" >> README.md
然后,您需要在规则中使用另一个$
转义$
:
README.md:
echo "Created at: $$(date)" >> README.md
否则,Make的变量date
被扩展,这将是echo
作为参数得到的,因为makefile中的$(date)
扩展了变量date
。
请注意,如果Make的变量date
定义如下,那么它将按预期工作,而不会引用规则中的$
:
date = $$(date)
README.md:
echo "Created at: $(date)" >> README.md
原因是变量date
(在规则的配方中使用)将被Make扩展为$(date)
,并将传递给shell。