shell中sh, export, source 使用注意变量的作用域

业务场景:
我在一个bash脚本中修改了PATH变量的内容,并将其保存到/etc/profile文件中,同时执行了
source /etc/profile
但是当脚本退出时,我 发现PATH变量还是没有修改生效,但是,如果我在命令行再直接执行
source /etc/profile
才发现PATH生效了。
请问,这是什么原因呢?


经过参阅《鸟哥的私房菜》中的相关内容p.307,export和source,总结的知识点是:
1.自定义变量和环境变量的区别,两者的差异就在于是否会被子进程所继续引用
2.当你登陆Linux并取得一个bash之后,你的bash就是一个独立的进程,接下来你在这个bash下面执行的任何命令都是由这个bash所衍生的子进程,
3.子进程仅会继承父进程的环境变量,但不会继承父进程的自定义变量,当子进程返回时,父进程的自定义变量依然有效
4.要让子进程继承父进程的自定义变量,需要将自定义变量变成环境变量,使用export命令
5. source命令即点(.)命令。source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。
exec命令也不产生新的子进程。那么exec与source的区别是什么呢?
exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。

shell中source和sh script的区别
有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不再启用其他shell。
新产生一个shell然后再执行scripts的方法是在scripts文件开头加入以下语句
#!/bin/sh
一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。
另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。

问题分析:
环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。
你在shell中调用的脚本,然后在脚本中调用source,设置的环境变量只对当前的shell脚本所在进程及由这个脚本fork的子进程中有效
然后你在shell中做其他操作的时候,之后设置的环境变量就不起作用了。

网上查到的同样的问题:
export命令为什么在shell脚本中执行不生效?
在服务器上执行如下命令是可以生效的,但是我把语句放在脚本里,如test.sh,然后我执行sh test.sh就不生效了,不知道神马原因?
export http_proxy= http://192.168.1.105:8080

解决方法:
source test.sh
不要直接采用
sh test.sh
————————————————
版权声明:本文为CSDN博主「雪峰流云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tao_627/article/details/49702505

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值