Подстановка переменных в строку - PullRequest
0 голосов
/ 28 апреля 2020

Предположим, я определил файл json:

foo.json:

{"key":"${VALUE}"}

makefile:

export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell cat foo.json)

bar:
    @echo "$(foo)"

Вопрос заключается в следующем: как расширить переменную ${VALUE} путем подстановки переменных make или подстановки echo BASH, чтобы двойные кавычки в действительном файле JSON сохранялись в OUTPUT (да, 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})

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Если вы хотите расширить переменные из среды Make, вы можете использовать eval для расширения переменных внутри присваивания.

Предполагая, что вы не возражаете против объединения всех строк в соответствии с комментарием @ MadScientists, вы можете выделить комментарии и объединить 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, он может заставить запускаться все, что пожелает, с привилегиями производителя.

1 голос
/ 28 апреля 2020

Если вы запустите этот 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}'
...