【问题标题】:Export .env with special characters导出带有特殊字符的 .env
【发布时间】:2019-09-06 07:22:33
【问题描述】:

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

例如,Dotenv 看起来像这样:

username=test
password=*fdas_dfar+)mbn

【问题讨论】:

  • 能否在您的问题中包含.env 文件或其中的摘录?
  • 这就是我想要避免手动执行的操作。有任何可用的命令吗?
  • 您是否尝试使用外部命令解析.env 并导出这些变量?
  • 这可以使用sed 命令完成,但问题是您所说的自动生成的文件是错误生成的。它应该引用所有值。你应该治本,而不是治标。
  • 你需要转义你的字符串。使用引号,或使用检查一下:stackoverflow.com/questions/43676064/…

标签: linux bash environment-variables


【解决方案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")
       
       # set the variable value using bash special builtin
       printf -v "$name" "%s" "$value"

 done <.env

【讨论】:

  • 可以使用declare -x,避免使用eval
  • 如何调用解析器在我的 .env 文件中的所有变量周围加上引号?
  • 您的意思是要编辑.env 文件以将引号放入其中?你想调用哪个解析器?我发布的代码片段是用 bash 编写的,仅仅是构建更复杂的东西的起点。我没有以任何方式测试代码。
  • 我认为这是为了在 .env 文件中放置引号
  • 我们需要在shell中解析字符串password=*fdas_dfar+)mbn。我使用eval 重新评估表达式。所以首先我得到=IFs== read 之后的字符串,剩下的是*fdas_dfar+)mbn。然后,如果该字符串中有任何',我将' 替换为'\''。然后我打电话给eval "$name='$value'" - 这样就可以设置变量了。这将评估password='*fdas_dfar+)mbn' 行并将字符串'*fdas_dfar+)mbn' 分配给变量password。由于该行被 bash 解析,引号 ' 被删除,因为发生了扩展。
【解决方案2】:

如果您希望能够source .env,那么它需要是有效的shell 语法。这意味着引用包含诸如) 之类的shell 元字符的值。如果这是不可能的,因为该文件还需要由其他无法处理引用的程序读取,那么您将需要一次读取并解析一行。不要按照旧答案中的建议使用evaleval 命令几乎总是导致比它解决的问题更多。与使用 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

【讨论】:

  • 在 IFS 之前我一直和你在一起。您对 IFS 有何不满?
  • bash、ksh 和 zsh 等 shell 实现的 POSIX shell 标准存在很多问题。但最糟糕的情况之一是IFS 以及它在变量扩展后导致的隐式分词。这就是为什么你必须在每次使用 shell var 时都加双引号。
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 2015-06-15
  • 2023-03-14
  • 2012-10-06
  • 2018-11-14
  • 2012-09-15
相关资源
最近更新 更多