[英]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.