不使用eval如何通过运行bash脚本设置当前shell的环境变量
无eval实现跨脚本环境变量生效的解决方案
方法1:调整version.sh后用source执行(最推荐)
这是最符合shell脚本规范的做法:
- 修改
version.sh内容,去掉外层的echo,直接写变量导出语句:
# version.sh 调整后内容 export VERSION="version-1.3"
- 在
test.sh中使用source(或简写为.)执行脚本,即可直接在当前shell拿到变量:
# test.sh 写法 source ./version.sh # 等价于 . ./version.sh echo $VERSION
说明:source会在当前shell环境中直接运行脚本内容,不会启动独立子shell,因此脚本内设置的所有变量、环境变量都会直接在当前shell生效。
方法2:无需修改原有version.sh的方案
如果你不能改动version.sh的现有内容,可以用进程替换把version.sh的输出传递给source执行,完全替代eval:
# test.sh 写法 source <(./version.sh) echo $VERSION
注意:如果运行提示权限不足,先执行
chmod +x version.sh给脚本添加可执行权限。
原理是<(./version.sh)会把version.sh运行输出的export VERSION="version-1.3"内容交给source读取执行,和原有eval写法效果完全一致,同时规避了eval的安全风险。
关于直接执行./version.sh的疑问
不能实现需求。直接运行./version.sh会启动独立的子shell进程,子shell内的所有环境变更都不会同步到父shell(也就是你运行脚本的当前环境),执行完成后当前shell的VERSION变量仍然是空值。
内容的提问来源于stack exchange,提问作者jipot
相关产品推荐
相关产品推荐

