[英]Make variable substitution in string
假设我定义了一个 json 文件:
foo.json
:
{"key":"${VALUE}"}
makefile:
export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell cat foo.json)
bar:
@echo "$(foo)"
问题是:我如何通过 make 的变量替换或echo
的 BASH 替换来扩展${VALUE}
变量,以便有效 JSON 文件中的双引号保留在Z50A87F0D71F7221582和 yesfoo 上, echo $(foo)
还评估变量-但删除双引号-是的,我不关心换行符被删除)?
至于这一切的原因,假设我有一个例程需要一个表达 JSON 文件,该文件相当于一种语言(而不是配置),并且我正在使用 Make 来控制系统:
.PHONY: generator
# in the language of control theory
generator: $(foreach q,${Qm},.Qmarked-startup-$q)
application $@ -i <(pseudo code: {envsubst $@.json})
.Qmarked-startup-%: $(pseudo code: q0 dependencies ... )
# $* here is a verb
application $* -i <(pseudo code: {envsubst $*.json})
如果你想从 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,那么他们可以使用制造商的权限让 make 运行任何他们想要的东西。
如果你运行这个 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}'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.