【问题标题】:Quotes stripped gnu make $(if ...) argument引号剥离 gnu make $(if ...) 参数
【发布时间】: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


【解决方案1】:

你误会了。永远不要去掉引号。但是,make 调用 shell,shell 会去掉引号。

如果您删除echo 行开头的@ 标记,您将看到make 如何调用shell;你会看到:

echo TESTFAILQUOTE = "var2_value1 var2_value2"
var2_value1 var2_value2
echo TESTPASSQUOTE = \"var2_value1 var2_value2\"
"var2_value1 var2_value2"

如果您在 shell 提示符下运行相同的 echo 命令,您将得到相同的结果,表明这些都与 make 无关。

【讨论】:

  • 谢谢,您说的完全正确。我正要自己回答,但你比我快!我会赞成答案,但还没有足够的信誉。
  • 单引号使在 shell 命令行上使用的变量扩展与在正常情况下双引号 shell 变量扩展的方式相同。您需要防止正常的外壳扩展/等。不会发生。
猜你喜欢
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2021-12-22
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
相关资源
最近更新 更多