shell/bash当读取导出变量不工作的替代



我想从文件导出变量。这是我的文件

cat file.txt
VERSION=1.0.0
LOCATION=USA
NAME=sample
ENVIRONMENT=$ENV

我导出文件中的所有变量使用while循环

while read vars; do export $vars;done < file.txt

ENVIRONMENT外的所有变量导出成功我得到了这个值,ENVIRONMENT=$ENV(期望值是ENVIRONMENT=staging)。

printenv | grep ^ENV
ENV=staging

我的问题是,为什么替代它不工作时使用while loop,但它的工作,如果我们手动导出(e.g export ENVIRONMENT=$ENV)?

实际上有很多方法,从文件导出变量,例如,我可以使用envsubst < file > file1,然后做while loop,但我只需要解释上面的情况。

展开的顺序在POSIX中描述:

展开词的顺序如下:

依次执行
  1. 波浪展开(参见波浪展开)、参数展开(参见参数展开)、命令替换(参见命令替换)和算术展开(参见算术展开)。参见令牌识别中的第5项。

  2. 字段分割(参见字段分割)应在步骤1生成的字段部分上执行,除非IFS为null。

  3. 必须执行路径名扩展(参见路径名扩展),除非设置-f生效。

  4. 报价删除(见报价删除)应始终在最后执行。

对于参数展开,tl;dr为:

${参数}

如果parameter的值有,则需要替换。

您将注意到该定义不是递归的或多遍历的。没有"5。返回步骤1并重复,直到无法执行进一步的展开",或" parameter的值(如果有)将被替换,并重复该过程,直到无法找到更多的参数展开。">

这意味着export $vars将在步骤1中展开$vars,但不会重复该步骤,因此留下$ENV

这也是所有其他编程语言的基本工作方式,例如Java:

String foo="bar";
String bar="baz";
// Prints `bar` without recursively resolving it into `baz`
System.out.println(foo);