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

Shell如何从.env文件设置环境变量,shell,Shell,假设.env文件包含以下行: USERNAME=ABC PASSWORD=PASS 与普通的文件不同,它有export前缀,因此我无法直接获取文件的源代码 创建从.env文件加载内容并将其设置为环境变量的shell脚本的最简单方法是什么 读行时;出口美元行;完成/dev/null)/.env&&[-f“$env_path”]};那么 echo“寻源$env_路径” 导出$(egrep-v'^#'“$env_path”| xargs) 其他的 回显“未找到环境文件” fi } 导出“$line

假设.env文件包含以下行:

USERNAME=ABC
PASSWORD=PASS
与普通的文件不同,它有
export
前缀,因此我无法直接获取文件的源代码

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

读行时
;出口美元行;完成<如果您的行是有效的,受信任的shell,但用于
导出
命令 这需要适当的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

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

export $(xargs <.env)

export$(xargs与@voutasaurus的答案类似,您也可以使用
$(egrep-v'^#'“$env_path”| xargs)
这里的好处是,它将忽略以#开头的行(用于注释)

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

setenv(){
本地环境路径
如果{[-f.env]&&env_path='.env';}{env_path=$(git rev parse--show top level 2>/dev/null)/.env&&[-f“$env_path”]};那么
echo“寻源$env_路径”
导出$(egrep-v'^#'“$env_path”| xargs)
其他的
回显“未找到环境文件”
fi
}

导出“$line”
的性能会更好一些,假设它是一行的一个变量,但值可以包含空格。也就是说,看看这段代码对
line=“hello world”
的作用——您可以将引号作为文字数据的一部分导出,而不是作为语法处理。这可能没问题,但因为OP说他们无法
源代码
文件的唯一原因是缺少
导出
前缀,所以很可能不是。此外,您还需要将参数
-r
添加到
读取
中,这样就不会弄乱反斜杠,并引用
“$line”
这样它的内容就不会在
export
看到它们之前被字符串拆分和glob展开。带空格的值是如何定义的?是
var=“value with spaces”
,还是
var=value with spaces
?这两种方法需要完全不同的方法。如果您的代码< >代码> .Env,可以用下面的代码创建:“代码> Prtff '%s\n’’密码=“两个单词”“另一个= FO’> .Env。在这种情况下,传递给
export
的参数将是
password=two
words
,以及
other=foo
words
将不再是
password
的一部分,它本身将是一个单独的参数(因此该命令将尝试导出一个名为
words
)的预先存在的变量。将
export$(xargs-L 1我不明白它是如何做到的-命令替换的输出仍然是word split(和glob扩展)在最后的
export
命令组装之前。
source.env
基本上完成了所需的工作。只需确保.env值中没有空格。@AdépòjùOlúwáségun,如果没有
set-a
export
,则只为本地shell设置值,而不是为其子进程设置值ays是“环境变量”,而不是“外壳变量”。
foo=bar
没有设置环境外壳变量,它设置了外壳变量。好吧,我想我的用例是不同的。谢谢你的解释
while IFS== read -r key value; do
  printf -v "$key" %s "$value" && export "$key"
done
export $(xargs <.env)