您的位置:首页 > 运维架构 > Shell

shell设置系统环境变量的问题

2015-11-07 15:34 525 查看
业务场景:
我在一个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

参考文献

[1].http://bbs.chinaunix.net/thread-2323631-1-1.html 这个提问和我遇到的问题是一样的,期待解决方案

[2].http://www.oschina.net/question/147332_131625 同样的问题

[3].http://blog.163.com/shi_shun/blog/static/237078492011112643525868/ sh和source 脚本的区别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: