shell/bash使用while read导出文件变量时$ENV引用未正常替换是什么原因
底层原理说明
- Shell执行命令遵循固定的预处理规则:所有变量扩展、命令替换、通配符展开操作,都会在命令实际执行前完成,且默认仅执行一次,不会对扩展后得到的字符串内容做递归二次扩展。
手动执行命令的流程
手动执行
export ENVIRONMENT=$ENV时:
- Shell首先对整行命令做预处理,识别到代码中直接写的
$ENV变量标记,将其替换为已存在的环境变量值staging,预处理完成后得到实际执行的命令:export ENVIRONMENT=staging- 预处理后的命令交给
export内置命令执行,最终变量赋值符合预期。
循环读取文件的执行流程
while循环逐行读取导出的场景下:
read vars操作仅会从文件中读取纯文本内容,不会做任何变量扩展处理,最终存入vars变量的内容就是原始字符串ENVIRONMENT=$ENV- 执行
export $vars时,Shell仅会对$vars本身做一次变量扩展,扩展后得到的命令为export ENVIRONMENT=$ENV,此时已经过了Shell预处理阶段,不会再对新生成的命令内容里的$ENV做二次识别和替换export内置命令接收到的参数就是ENVIRONMENT=$ENV,因此会直接将$ENV作为普通字符串存入变量值,不会做额外替换。
本质原因是你文件中的$ENV是存在于文本内容里,不是直接写在Shell待执行的代码中,不会被Shell的预处理逻辑识别为需要替换的变量标记,只会被当成普通字符组合处理。
内容的提问来源于stack exchange,提问作者Fixlensmith
相关产品推荐
相关产品推荐

