Bash 导出变量但仅适用于当前命令
Bash export variables but only for current command
我想在 运行 节点脚本之前从文件加载一些环境变量,以便脚本可以访问它们。但是,我不希望在脚本执行完成后在我的 shell 中设置环境变量。
我可以这样加载环境变量:
export $(cat app-env-vars.txt | xargs) && node my-script.js
但是,在命令运行之后,所有的环境变量现在都设置在我的shell.
我问这个问题是为了回答它,因为我想出了一个解决方案,但找不到关于 SO 的答案。
如果您将命令括在括号中,export
s 将被限定在这些括号内,并且不会污染全局 shell 命名空间:
(export $(cat app-env-vars.txt | xargs) && node my-script.js)
执行命令后回显 app.env
文件中的环境变量之一会将其显示为空。
如果你的文件只包含像
这样的变量
FOO='x y z'
BAR='bar'
...
你可以试试
eval $(< app-en-vars.txt) node my-script.js
这就是 env
命令的用途:
env - run a program in a modified environment
您可以尝试类似的方法:
env $(cat app-en-vars.txt) node my-script.js
这个(以及任何未加引号的 $(...)
扩展)受 word splitting and glob expansion 的约束,这两者都很容易导致环境变量等问题。
更安全的方法是使用数组,如下所示:
my_vars=(
FOO=bar
"BAZ=hello world"
...
)
env "${my_vars[@]}" node my-script.js
如果需要,您可以populate an array from a file。请注意,您还可以使用 -i
和 env
来 仅 传递您显式设置的环境变量。
如果您信任 .txt
的文件内容,并且它包含有效的 Bash 语法,您应该 source
它(并可能将其重命名为 .sh
/.bash
扩展)。然后,您可以使用 subshell,正如您在答案中发布的那样,以防止 source
d 状态泄漏到父级 shell:
( source app-env-vars.txt && node my-script.js )
我想在 运行 节点脚本之前从文件加载一些环境变量,以便脚本可以访问它们。但是,我不希望在脚本执行完成后在我的 shell 中设置环境变量。
我可以这样加载环境变量:
export $(cat app-env-vars.txt | xargs) && node my-script.js
但是,在命令运行之后,所有的环境变量现在都设置在我的shell.
我问这个问题是为了回答它,因为我想出了一个解决方案,但找不到关于 SO 的答案。
如果您将命令括在括号中,export
s 将被限定在这些括号内,并且不会污染全局 shell 命名空间:
(export $(cat app-env-vars.txt | xargs) && node my-script.js)
执行命令后回显 app.env
文件中的环境变量之一会将其显示为空。
如果你的文件只包含像
这样的变量FOO='x y z'
BAR='bar'
...
你可以试试
eval $(< app-en-vars.txt) node my-script.js
这就是 env
命令的用途:
env - run a program in a modified environment
您可以尝试类似的方法:
env $(cat app-en-vars.txt) node my-script.js
这个(以及任何未加引号的 $(...)
扩展)受 word splitting and glob expansion 的约束,这两者都很容易导致环境变量等问题。
更安全的方法是使用数组,如下所示:
my_vars=(
FOO=bar
"BAZ=hello world"
...
)
env "${my_vars[@]}" node my-script.js
如果需要,您可以populate an array from a file。请注意,您还可以使用 -i
和 env
来 仅 传递您显式设置的环境变量。
如果您信任 .txt
的文件内容,并且它包含有效的 Bash 语法,您应该 source
它(并可能将其重命名为 .sh
/.bash
扩展)。然后,您可以使用 subshell,正如您在答案中发布的那样,以防止 source
d 状态泄漏到父级 shell:
( source app-env-vars.txt && node my-script.js )