如何在命令行上设置环境变量文件?

如何在命令行上设置环境变量文件?

我有一个文件 .env.local,其中包含一组应在启动 shell 脚本时加载的环境变量,有没有办法在命令行中指定此文件?

.env.local

ONEDRIVE_TENANT_ID=...
ONEDRIVE_CLIENT_ID=...
ONEDRIVE_CLIENT_SECRET=...

shell脚本:script.sh

#!/usr/bin/env bash
TENANT_ID=${ONEDRIVE_TENANT_ID}
CLIENT_ID=${ONEDRIVE_CLIENT_ID}
CLIENT_SECRET=${ONEDRIVE_CLIENT_SECRET}
REDIRECT_URI=${ONEDRIVE_REDIRECT_URI}
curl REDIRECT_URI ...

我已经尝试过:source .env.local; sh script.sh但它没有按预期工作!
Ps,我无法在脚本中添加源代码,因为脚本将在许多环境中运行,因此 .env.local 的绝对路径取决于环境。

答案1

您可以设置BASH_ENV为通过变量赋值指向您的点脚本。这样做会导致在运行脚本之前自动获取它,从而使 shell 变量在脚本中可用。

BASH_ENV=path/to/.env.local ./script.sh

如果script.shbash脚本,则它将可以访问.env.local点脚本中的变量(和函数等)。

bash手册:

BASH_ENV
如果在执行 shell 脚本时设置此参数bash,则其值将被解释为包含初始化 shell 的命令的文件名,如~/.bashrc.的值BASH_ENV在被解释为文件名之前经过参数扩展、命令替换和算术扩展。 PATH不用于搜索结果文件名。


请注意,您的脚本是不是如果您在命令行上bash使用其他脚本语言的显式解释器(例如您似乎在问题中所做的那样),则由 执行。sh

答案2

source .env.local; sh script.sh将在父 shell 的上下文中运行.env.local,而不是在script.sh.在那里设置的常规 shell 变量对于子进程是不可见的。您需要明确地说明export它们。

使其.env.local看起来像这样:

export ONEDRIVE_TENANT_ID=...
export ONEDRIVE_CLIENT_ID=...
export ONEDRIVE_CLIENT_SECRET=...

答案3

尝试在脚本内部调用source "file.env.local"(编辑:在调用变量/数组之前)

或者这可以帮助 https://stackoverflow.com/questions/19331497/set-environment-variables-from-file-of-key-value-pairs

相关内容