3

BSD make 有一个:Q变量扩展修饰符,在FreeBSD make 手册页中记录如下:

:Q   Quotes every shell meta-character in the variable, so that it can be
     passed safely through recursive invocations of make.

如果 variablevar具有 value a b\c"d'e$f,则$(var:Q)扩展为a\ b\\c\"d\'e\$f(或等效的)。这对于将字符串传递给 shell 很有用,而不必担心 shell 会解释任何特殊字符。

GNU make 有等价物吗?还是我必须自己转义特殊字符?

4

2 回答 2

2

GNU make 提供了subst可以patsubst帮助解决问题的功能。这些更通用,但需要开发人员进行更多工作,因为它们不能解决特定问题。此外,文档没有显示他们使用正则表达式,增加了工作。

例如,您原则上可以构建这样的表达式:

$(subst \\,\\\\,$(subst ",\", $(subst ',\', var)))

如需更多讨论,

于 2015-06-03T09:11:03.380 回答
2

对于sh变体,只需将表达式用单引号括起来,将任何嵌入的单引号更改为'"'"'.

quote = '$(subst ','"'"',$1)'

用法:

$(error [$(call quote,ab'c\ d$$f)])

脚注:单引号内无法引用任何内容。因此,第二个单引号关闭了引用的表达式。所以,要处理嵌入的单引号,用 关闭单引号',添加带引号的单引号"'",开始另一个单引号字符串'

于 2015-06-04T10:16:32.180 回答