Bash 导出变量但仅适用于当前命令

Bash export variables but only for current command

我想在 运行 节点脚本之前从文件加载一些环境变量,以便脚本可以访问它们。但是,我不希望在脚本执行完成后在我的 shell 中设置环境变量。

我可以这样加载环境变量:

export $(cat app-env-vars.txt | xargs) && node my-script.js

但是,在命令运行之后,所有的环境变量现在都设置在我的shell.

我问这个问题是为了回答它,因为我想出了一个解决方案,但找不到关于 SO 的答案。

如果您将命令括在括号中,exports 将被限定在这些括号内,并且不会污染全局 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。请注意,您还可以使用 -ienv 传递您显式设置的环境变量。


如果您信任 .txt 的文件内容,并且它包含有效的 Bash 语法,您应该 source 它(并可能将其重命名为 .sh /.bash 扩展)。然后,您可以使用 subshell,正如您在答案中发布的那样,以防止 sourced 状态泄漏到父级 shell:

( source app-env-vars.txt && node my-script.js )