假设我定义了一个json文件:
// foo.json
{"key":"${VALUE}"}
和一个makefile:
export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell cat foo.json)
bar:
@echo "$(foo)"
[问题是:如何通过make的变量替换或${VALUE}
的BASH替换来变量扩展echo
,以便保留有效JSON文件中的双引号?
如果运行此Makefile:
export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell cat foo.json)
bar:
$(warning $(foo))
您可以看到$(foo)确实包含双引号。但是$ VALUE不会扩展。
您可以尝试这个:
export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell VALUE=$(VALUE) envsubst < foo.json)
bar:
@echo '${foo}'
如果要在Make的环境中扩展变量,则可以使用eval
来扩展赋值内部的变量。
[假设您不介意按照@MadScientists的注释将所有行合并在一起,则可以将注释grep出来,并将json合并为一行,如下所示:
export VALUE:=bar
foo:=$(shell grep -v "^\S*//" foo.json)
$(info foo=[$(foo)])
$(eval foo2:=$(shell grep -v "^\S*//" foo.json))
$(info foo2=[$(foo2)])
bar:
@echo "from recipe: foo2=[$(subst ",\",$(foo2))]"
$(subst ",\",...)
在发送给bash之前转义了引号。输出:
foo=[{"key":"${VALUE}"}]
foo2=[{"key":"bar"}]
from recipe: foo2=[{"key":"bar"}]
注意:出于安全考虑,如果外部人可以访问foo.json,则他们可以使用制造商的特权进行所需的运行。