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 脚本的区别
我在一个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 脚本的区别
相关文章推荐
- cron sh: casperjs: command not found 在cron php脚本中,通过shell_exec 报错
- GNU Linux shell时不进行回显(输入密码时不显示的需求)
- sh,bash,csh,tcsh等shell的区别
- vb.net如何判断shell完成,或者等待shell完成
- bash shell 之变量笔记
- linux shell 编程6 tomcat的启动停止
- 几个有用的Shell别名和函数
- 在windows下用XShell 连接虚拟机linux Ubuntu14,以及静态ip,DNS设置
- Linux 下 shell 编写 计算器
- 《Linux命令、编辑器与Shell编程》读书笔记4.1-查找和筛选工具(grep,find,sed)
- linux笔记:shell基础和bash的基本功能
- linux shell(2)
- shell脚本操作mysql数据库
- php调用shell脚本(web端和客户端同时实现)
- /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc
- Linux shell(1)
- shell必懂知识点
- Bash特性总结
- 将文件内容逐行读取处理并写入对应文件中
- linux vim .bashrc 配置以及一些常用的linux 命令解析