使用特殊字符导出.env

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (147)

我用set -o allexport; source .env; set +o allexport来从.env文件导出所有变量。不幸的是,一个变量包含)导致语法错误的原因。使用上述命令有解决方案吗?我知道可以在括号中设置它,但.env在某种程度上是自动生成的,没有括号。

Dotenv看起来像这样:

username=test
password=*fdas_dfar+)mbn
提问于
用户回答回答于
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
用户回答回答于

如果你想能够用source .env那么它需要是有效的shell语法。这意味着引用包含shell metachars的值)。如果这是不可能的,因为该文件也需要由其他无法处理引用的程序读取,那么您需要一次读取并解析一行。请勿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

扫码关注云+社区

领取腾讯云代金券