我想从文件导出变量。这是我的文件
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中描述:
展开词的顺序如下:
依次执行
波浪展开(参见波浪展开)、参数展开(参见参数展开)、命令替换(参见命令替换)和算术展开(参见算术展开)。参见令牌识别中的第5项。
字段分割(参见字段分割)应在步骤1生成的字段部分上执行,除非IFS为null。
必须执行路径名扩展(参见路径名扩展),除非设置-f生效。
报价删除(见报价删除)应始终在最后执行。
对于参数展开,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);