【发布时间】:2015-02-17 16:29:01
【问题描述】:
GNU 中关于引号字符的规则是什么?我曾认为在大多数情况下,它们只是 make 文件中文本的一部分,通常没有特殊的意义。以下简单的 make 文件演示了出现在 $(if ...) 参数周围的双引号字符被剥离,而不是从 $(if) 调用中传递出去。这似乎是错误的,奇怪的是,未转义的引号确实在我一直使用的更复杂的 make 文件中通过。
include gmsl
VAR1 ?= var1_value
VAR2 ?= var2_value1 var2_value2
failquote = $(if $(call ne,$(words $(1)),1),"$(1)",$(1))
passquote = $(if $(call ne,$(words $(1)),1),\"$(1)\",$(1))
TESTFAILQUOTE = $(call failquote,$(VAR2))
TESTPASSQUOTE = $(call passquote,$(VAR2))
quotetest :
@echo "--->Executing recipe for quotetest"
@echo VAR2 is $(VAR2)
@echo TESTFAILQUOTE = $(TESTFAILQUOTE)
@echo TESTPASSQUOTE = $(TESTPASSQUOTE)
输出如下:
bash-4.1$ make -f test_quote.mk quotetest
--->Executing recipe for quotetest
TESTFAILQUOTE = var2_value1 var2_value2
TESTPASSQUOTE = "var2_value1 var2_value2"
注意:对于 $(call ne,...),您需要 Gnu Make Standard 库才能使该 make 文件正常工作。在这里找到它:http://gmsl.sourceforge.net/
【问题讨论】:
-
这里的实际问题是什么?该输出是否以某种方式不正确? MadScientist 是否正确,这里的问题只是输出缺少引号,因为外壳正在剥离它们?
-
问题是我需要输出中的文字引号字符。 MadScientist 在他/她的帮助下既敏锐又非常亲切,而且是正确的 - 如果引号需要进入“echo”命令,则需要在 make 变量值中对其进行转义。
-
不,在变量值中转义它们不是答案。答案是在 shell 行上引用变量扩展,这样 shell 就不会剥离它们。
-
为了记录,这里包含 gmsl 等只是 非常 就我而言混淆了这个问题,应该完全排除在外。
-
@EtanReisner:实际上是答案,因为有问题的shell实际上是$(shell ...),所以我没有机会在那里逃脱。我把那部分放在外面是为了解决这个问题,正如你指出的那样,出于同样的原因,我应该忽略 gmsl 的使用。
标签: macros makefile arguments quotes strip