我正在使用set -o allexport; source .env; set +o allexport
从.env文件中导出所有变量。不幸的是,一个变量包含)
,因此导致语法错误。上面的命令有解决方案吗?我知道可以在括号中设置它,但是.env会自动生成而没有括号。
Dotenv例如:
username=test
password=*fdas_dfar+)mbn
答案 0 :(得分:1)
source .env
source
是一个shell命令,.env
文件被解析为shell文件。您需要像在shell中一样引用字符串。
username=test
password='*fdas_dfar+)mbn'
这有什么用,您可以从该文件运行所有shell命令:
username=$(echo test)
password='*fdas_dfar+)mbn'
或者您可以编写自己的解析器,例如:
while IFS='=' read -r name value; do
if [ -z "$value" -o -z "$name" ]; then
echo "Error - unparsable line!" >&2
exit 1
fi
# add quotes around `'`
value=$(<<<"$value" sed "s/'/'\''/g")
# this line can be very dangerous(!)
# eval is evil
# set variable with name $name to the value $value
eval "$name='$value'"
done <.env
答案 1 :(得分:0)
如果您希望能够source .env
,则它必须是有效的Shell语法。这意味着引用包含诸如)
之类的外壳元字符的值。如果由于无法处理该报价的其他程序也需要读取该文件而导致无法执行此操作,则您将需要一次读取并解析该行。请勿按照较早答案中的建议使用eval
。 eval
命令几乎总是引起比其解决的问题更多的问题。我更喜欢这种方法而不是使用IFS技巧,因为IFS本身具有固有的危险性,应始终在每个脚本的顶部将其设置为IFS=$'\n'
,并且随后不要更改:
while read -r line
do
# Insert appropriate checks for malformed input or comments here.
key="${line%%=*}"
val="${line#*=}"
export "$key"="$val"
done < .env
但是,如果您知道输入的格式正确并且喜欢危险地生活,那么这也很好:
while IFS='=' read -r key val
do
export "$key"="$val"
done < .env