给定一个带有变量的 .env 文件DB_USER=foo@bar
,对于 Makefile:
.ONESHELL:
SHELL:=/bin/bash
all:
set -o allexport;source .env ;set +o allexport && echo $(DB_USER)
和
$ make all
$ set -o allexport;source .env ;set +o allexport && echo
在终端工程中测试这个:
$ set -o allexport;source .env ;set +o allexport; && echo $DB_USER
$ foo@bar
如何在 makefile 中解决这个问题?
改成。
echo $(DB_USER)
echo $$DB_USER
然后:
为什么?
该配方在父级为 的 shell 中运行
make
。$(DB_USER)
指make's
环境中未定义的 make-variable。$DB_USER
是对子 shell 环境中变量的引用,您已在.env
同一 shell 的文件中设置该变量,因此您可以引用它。子进程无法将环境变量推入其父进程,即使可以,也是没有意义的:只有正在运行的 shell 需要该值。您需要
$DB_USER
像$$DB_USER
在配方的上下文中一样进行转义,否则将在配方运行之前make
展开$DB_USER
==$(D)B_USER
。GNU Make 手册:6.1 变量引用基础知识B_USER
同样,你总是需要
$shellvar
像$$shellvar
在菜谱上下文中一样进行转义。