我有一个文件 .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.sh
是bash
脚本,则它将可以访问.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