Shell如何从.env文件设置环境变量
假设.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
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)