![](/img/trans.png)
[英]How can I set environment variables from Heroku for a single bash command, not for the whole shell session?
[英]How can I support comments when eval'ing a file to set environment variables for a single command?
我正在使用一个文件variables.env
的项目,并添加VAR_THREE
并对其进行注释,如下所示:
VAR_ONE=val1
VAR_TWO=val2
# comment the purpose of the new variable
VAR_THREE=val3
在命令行中,我运行它来设置变量并启动程序(通过项目中现有的shell脚本运行):
eval $(cat variables.env) java -jar my.jar
此注释似乎适用于所有之后的内容,包括java
命令,这可以通过检查echo $VAR_THREE
没有值来明显看出,而我的.jar也没有输出。 如果我对variables.env
保留我的注释, VAR_THREE
设置VAR_THREE
,程序将运行并产生输出。
有没有办法允许变量文件中的注释不应用于后续行和命令?
简单的事情是使用子外壳。
(set -a; . variables.env; exec java -jar my.jar)
要将其分解为各个组成部分:
( ... )
将整个代码放在一个subshell内-用fork()
创建的shell副本,但是没有exec
-family调用-因此,所有变量都不会在其完成之后持续存在。 set -a
告诉外壳程序将所有变量自动导出到环境中(这样它们将对java
子进程可见)。 由于存在子外壳程序,因此其范围仍然仅限于此处运行的代码。 . variables.env
. variables.env
是一个更便携相当于source variables.env
,运行的内容variables.env
为脚本。 exec
告诉已经存在的子shell用java
可执行文件替换自身 。 如果没有exec
(缺少某些特定于场景/未记录的运行时优化),则运行外部命令将创建一个新的子shell,告诉新的子shell用java
可执行文件替换自身,然后等待新的子shell退出; 通过运行exec java
,我们将使用已经完成的子shell,而不是创建第二个。 ...还有一个额外的好处,您不会得到eval
的不良副作用(在传递包含空格或其他语法敏感字符的参数时,会引起额外的字符串拆分,glob扩展以及其他潜在的混乱) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.