繁体   English   中英

评估文件以为单个命令设置环境变量时如何支持注释?

[英]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)

要将其分解为各个组成部分:

  • ( ... )将整个代码放在一个subshel​​l内-用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM