【发布时间】:2020-04-28 15:52:40
【问题描述】:
假设我定义了一个json文件:
foo.json:
{"key":"${VALUE}"}
制作文件:
export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell cat foo.json)
bar:
@echo "$(foo)"
问题是:我如何通过 make 的变量替换或 echo 的 BASH 替换来扩展 ${VALUE} 变量,以便在 OUTPUT 上保留有效 JSON 文件中的双引号(是 make保留它们,是的,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})
【问题讨论】:
-
您究竟希望该 makefile 打印什么?
-
如果您向我们展示您真正想做的事情会更好。这(使用
$(shell ...))不太可能完成您真正想做的事情,因为它总是会丢弃所有换行符(例如)。如果我们知道您真正想要实现的目标,而不是echo ...,那么可能有更好的方法来实现。 -
@MadScientist 已编辑和更新。
-
如果您的示例中没有注释
// foo.json,那么您不关心换行会更清楚...如果您有,那么您的整个 JSON 文件将被注释删除换行符时退出... -
@MadScientist 该评论是为了表明降价的上下文在文件 foo.json 中。