Make没有提供读取文件内容到变量的方法。因此,我认为不使用外部工具无法实现结果。但是,如果我错了,我很乐意学习一些新技巧。
所以,假设有两个文件,.env
是一个技术上正确的shell文件:
FOO=bar
BAR="notfoo"
MULTILINE="This\nis\nSparta!"
和 script.sh
:
#!/bin/bash
echo FOO=${FOO}
echo BAR=${BAR}
echo -e ${MULTILINE}
一种解决方法是将.env
文件包含进来,然后确保变量被导出:
include .env
$(eval export $(shell sed -ne 's/ *#.*$$//; /./ s/=.*$$// p' .env))
all:
./script.sh
由于Shell和Make处理引号的方式不同,因此您会在输出中看到引号。
您可以通过重新对变量进行Make处理来避免这种情况:
include .env
VARS:=$(shell sed -ne 's/ *\#.*$$//; /./ s/=.*$$// p' .env )
$(foreach v,$(VARS),$(eval $(shell echo export $(v)="$($(v))")))
all:
./script.sh
但是多行变量会变成一行。
最后,您可以生成一个临时文件,在运行任何命令之前将其传递给Bash并进行处理:
SHELL=bash
all: .env-export
. .env-export && ./script.sh
.env-export: .env
sed -ne '/^export / {p;d}; /.*=/ s/^/export / p' .env > .env-export
哦,多行变量中的换行符出了问题。您需要额外引用它们。
最后,您可以使用上述sed
命令向.env文件中添加export
,然后执行:
SHELL=bash
%: .env-export
. .env-export && make -f secondary "$@"
include
起作用了。 - ArturFH$(eval )
来实现这个目标的非常复杂的方法,但这听起来不是一个好主意。如果你能说明通过导出这些变量想要实现什么目标,可能会有更直接的解决方案。 - user2371524.env
文件来存放所有构建/部署配置所需的环境变量。由于make
是编排构建/部署的工具,如果我能够轻松地在不使用外部工具的情况下使用这个.env
就好了。 - Bastian Venthur