Shell如何从.env文件设置环境变量

时间:2017-04-06 23:36:25

标签: shell

假设我的.env文件包含如下所示的行:

USERNAME=ABC
PASSWORD=PASS

与正常版本不同,前缀为export,因此我无法直接获取文件。

创建从.env文件加载内容并将其设置为环境变量的shell脚本的最简单方法是什么?

4 个答案:

答案 0 :(得分:8)

如果您的行有效,可信shell export命令

这需要适当的shell引用。如果您有foo='bar baz'之类的行,那么它是合适的,但是如果写出同一行则不行foo=bar baz

set -a # automatically export all variables
source .env
set +a

如果您的行不是有效的shell

以下内容读取键/值对,而期望或尊重shell引用。

while IFS== read -r key value; do
  printf -v "$key" %s "$value" && export "$key"
done

答案 1 :(得分:7)

这将导出.env中的所有内容:

export $(xargs <.env)

答案 2 :(得分:1)

发现这个:

http://www.commandlinefu.com/commands/view/12020/export-key-value-pairs-list-as-environment-variables

while read line; do export $line; done < <(cat input)

更新所以我的工作方式如下:

#!/bin/sh
while read line; do export $line; done < .env

答案 3 :(得分:0)

类似于@voutasaurus 的回答,你也可以使用 $(egrep -v '^#' "$env_path" | xargs) 这里的好处是它会忽略以 # 开头的行,用于注释)

我也在我的 .bashrc 中创建了这个函数。它要么在本地目录中获取 .env 文件,要么移动到 git 根目录(如果在 git repo 中)并尝试在该目录中获取 .env 文件。然后,我可以在 shell 中运行 setenv 来导入环境

setenv() {
  local env_path
  if { [ -f .env ] && env_path='.env'; } || { env_path=$(git  rev-parse --show-toplevel 2>/dev/null)/.env && [ -f "$env_path" ]; }; then
    echo "sourcing $env_path"
    export $(egrep -v '^#' "$env_path" | xargs)
  else
    echo "No env file found"
  fi
}