如何防止GNU Make解释字符串?

时间:2014-03-19 14:20:53

标签: makefile gnu gnu-make

正如我在this post中提到的,我通常会递归地升级我的git子模块,如下所示:

git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

从终端调用时,此命令可以正常工作。现在我很难将其嵌入到GNU make中,就像在this Makefileupgrade目标中一样。 如果我只是复制粘贴命令:

upgrade:
   git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

它不起作用:尽管存在简单的引号,GNU make尝试评估/解释$(git ...)部分。到目前为止,我尝试了几次没有成功的尝试($$\(git ...),定义了一个逐字命令as explained here等)。

你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

在配方中唯一特殊的字符是$(和反斜杠/换行符组合,但在换行符之前只有反斜杠,不在其他地方)。每个其他字符都被忽略并传递给命令。

并且引用$的唯一方法是将其加倍,$$

因此,要引用$(git rev-parse ...),您只需撰写$$(git rev-parse ...)即可。不需要反斜杠等。只需要使用shell命令和字面意思使用的每个$,字符串中的任何位置,忽略所有类型的shell引用,将其设置为$$