shell脚本中export无效的原分析和解决方法(整理)

0. 问题场景:shell脚本中的export怎么都无法起作用

测试需要导入大量临时的环境变量,单个export又比较麻烦,因此创建shell脚本简化场景:

#!bin/bash  
export PATH=$PATH:/usr/lib/java/jre  
export PATH=$PATH:/usr/lib/java/bin 

就这么个系统环境变量配置,通过./path.sh 或者 sh path.sh怎么执行都无法设置成功,为什么单独执行export一点问题都没有,但是写到shell脚本中执行,export却怎么都不起作用?

1. 原因

  1. shell是一个进程,每个进程拥有独立的存储空间,进程间数据不可见
  2. 一个shell中的系统环境变量(用export定义的变量)只会对当前shell或者他的子shell有效,该shell结束之后,变量生命周期结束(并不能返回到父shell中)
  3. export定义的变量,对当前shell及子shell有效;不用export定义的变量,仅对本shell有效
  4. 执行脚本时,是创建了一个新的子shell进程运行,脚本执行完成后,该子shell进程自动退出
    因此,子shell中定义的系统环境变量是无法作用于父shell的。

2. 解决方法

上文可知,父shell可将自己的环境变量写入子shell,但子shell无法将自己空间中的数据写入父shell(至少export不行),如何达到我们的需求,那就不要创建子shell,仅导入shell文件内的内容

  1. . path.sh #注意,这里使用的是“点命令”,中间有空格
  2. source path.sh
  3. 代码取出,在当前shell中export

3. “.”、“source”、“sh”、“./”、“export”的区别

  1. source 同“.”, 用于使shell读入指定的shell文件,并依次执行文件中的所有语句(当前shell)
  2. sh 创建一个子shell,继承父shell的环境变量,同时在子shell中执行脚本里面的语句
  3. ./ 当脚本文件具有可执行属性时,与sh无异,./filename是因为当前目录并未在PATH中
  4. export 设置或显示环境变量,临时作用于当前shell

站内参考

  1. 脚本中export不起作用的原因分析
  2. Shell脚本中的export
  3. source、sh、./、export 命令执行的区别
  4. export 原理解析 (Shell Script)
  • 15
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值