在 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 命令包含变量的双引号扩展,可容纳变量值中的各种特殊字符,包括换行符和双引号。
如果我这样做
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 命令包含变量的双引号扩展,可容纳变量值中的各种特殊字符,包括换行符和双引号。