在 makefile 中回显 JSON 环境变量

echo a JSON environment variable in a makefile

如果我这样做

user $ export JSON='
{
    "key":"val"
}
'

然后在我的 Makefile 中做

.PHONY: test
test:
    @echo ${JSON}

我收到以下错误:

user $ make test

/bin/bash: -c: line 1: syntax error: unexpected end of file
make: *** [Makefile:166: test] Error 1

我想我可以做到

user $ export JSON='{"key":"val"}'

.PHONY: test
test:
    @echo '${JSON}'

有效

您似乎已经认识到,问题出在(缺少)引号上。与此相结合,是否 make 扩展变量引用或将其延迟以供 shell 执行(这是环境变量的一个选项,但不是 make变量)。 make 扩展变量,然后 尝试将配方分成几行。变量值中的换行符会干扰它。

但是对于这样的环境变量,您可以通过将 $ 转义为 make 来延迟对 shell 的扩展来解决各种问题:

.PHONY: test
test:
    @echo "$${JSON}"

$$ 表示 $make 的文字,并抑制变量 JSON 的扩展。生成的 shell 命令包含变量的双引号扩展,可容纳变量值中的各种特殊字符,包括换行符和双引号。