红联Linux门户
Linux帮助

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

发布时间:2015-11-22 15:43:04来源:linux网站作者:雪峰流云

业务场景:
我在一个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


在Ubuntu下修改用户环境变量及系统环境变量:http://www.linuxdiyf.com/linux/9898.html

Ubuntu系统环境变量配置文件:http://www.linuxdiyf.com/linux/3351.html

CentOS修改系统环境变量:http://www.linuxdiyf.com/linux/3114.html

操作系统环境变量LANG和NLS_LANG的关系:http://www.linuxdiyf.com/linux/1352.html