bash中source导入的变量未出现在printenv/env输出如何解决
问题原因
该现象确实和export机制直接相关。
Bash中的变量分为两类:
- 本地shell变量:直接通过
VAR=value格式定义,仅存在于当前shell进程内部,不会传递给子进程。printenv、env都是独立的外部命令,运行时会启动新的子进程,无法读取到这类变量。 - 环境变量:通过
export VAR=value格式定义,会被加入进程的环境变量表,所有子进程都可以读取,printenv输出的就是所有环境变量的内容。
你给出的示例中,source envfile.env只是将文件中的内容逐行在当前shell执行,仅定义了本地shell变量,自然不会出现在printenv的输出结果中。
解决方案
根据你的使用场景,可以选择以下任意一种方式实现需求:
方案1:修改env文件内容,给变量增加export前缀
如果可以调整env文件的格式,直接在变量定义前加export即可,source后变量会自动成为环境变量:
# 修改env文件内容 echo "export HALLO=bla" > envfile.env # 加载变量 source envfile.env # 验证 printenv | grep HALLO # 正常输出HALLO=bla
方案2:不修改原env文件,加载时批量自动导出
如果不能修改原env文件的格式,可以开启allexport选项后再source,此时加载的所有变量都会自动标记为环境变量:
set -a # 开启allexport,后续所有定义的变量自动导出为环境变量 source envfile.env set +a # 关闭allexport,避免影响后续变量定义 # 验证 printenv | grep HALLO # 正常输出HALLO=bla
方案3:单次运行命令时临时传递变量
如果只是运行popper工具时需要用到这些变量,无需修改当前shell的环境,直接在命令前批量导入变量即可:
env $(cat envfile.env | xargs) popper run <你的其余参数>
内容的提问来源于stack exchange,提问作者white_gecko
相关产品推荐
相关产品推荐

