免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2396 | 回复: 7
打印 上一主题 下一主题

关于子shell中的变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-16 16:16 |只看该作者 |倒序浏览
早就有前辈高人讲过此类问题,不过将今天所学的东西小小总结一下,和各位分享,顺便抛砖引玉!不足之处,敬请指正!

一、对于shell脚本,内部函数的优先级别大于外部命令,但小于内部命令(shell builtin)
如脚本如下:
  1. cd()
  2. {
  3.         date +'111'
  4. }
  5. cat()
  6. {
  7.         date +'222'
  8. }
  9. cd
  10. cat
复制代码

运行结果:
  1. 222
复制代码


二、对于shell脚本中的子函数,所定义的变量都是全局变量,并且全局作用。

如:
  1. b()
  2. {
  3.   echo "b.in=[$var]"
  4.   var=456
  5. }
  6. a()
  7. {
  8.   echo "a.in=[$var]"
  9.   var=123
  10. }

  11. var=100
  12. a
  13. echo "a.out=[$var]"
  14. b
  15. echo "b.out=[$var]"
复制代码

运行结果:
  1. a.in=[100]
  2. a.out=[123]
  3. b.in=[123]
  4. b.out=[456]
复制代码


三、对于sh执行或直接调用的子shell(启动子进程调用),只有在主shell中export的变量才能由子shell使用,
     但是修改后的值无法返回主shell
如:
a.sh的脚本内容为:
  1. echo "a.in=[$var]"
  2. var=123
复制代码


test.sh的内容为:
  1. var=100
  2. sh a.sh
  3. echo "a.out=[$var]"
  4. export var
  5. ./a.sh
  6. echo "a.out=[$var]"
复制代码

运行结果:

  1. a.in=[]
  2. a.out=[100]
  3. a.in=[100]
  4. a.out=[100]
复制代码


四、 对于通过.执行的子shell(直接在当前进程中调用,不启动子进程),可以直接使用主shell变量,无需export,并且
     修改后的值可以直接在主shell中生效

a.sh的脚本内容为:
  1. echo "a.in=[$var]"
  2. var=123
复制代码


test.sh的内容为:
  1. var=100
  2. . ./a.sh
  3. echo "a.out=[$var]"
  4. export var
  5. . ./a.sh
  6. echo "a.out=[$var]"
复制代码


运行结果:
  1. a.in=[100]
  2. a.out=[123]
  3. a.in=[123]
  4. a.out=[123]
复制代码


五、 对于exec调用的子shell(停止当前进程,重新启动一个新进程),只有在主shell中export的变量才能使用,但
     调用后无法再回到主shell

a.sh脚本内容:
  1. echo "a.in=[$var]"
  2. var=123
复制代码


test.sh的内容为:
  1. var=100
  2. exec ./a.sh
  3. echo "a.out=[$var]"
复制代码


运行结果:
  1. a.in=[]
复制代码


六、 对于eval进行调用的情况,主要根据执行的命令串的内容来确定。

test.sh的内容如下:
  1. var=100
  2. eval "./a.sh"
  3. echo "a.out=[$var]"
  4. eval ". ./a.sh"
  5. echo "a.out=[$var]"
复制代码


运行结果:
  1. a.in=[]
  2. a.out=[100]
  3. a.in=[100]
  4. a.out=[123]
复制代码

评分

参与人数 2可用积分 +12 收起 理由
liaosnet + 2 精品文章
寂寞烈火 + 10 原创内容

查看全部评分

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2009-02-16 16:20 |只看该作者
不错不错,加分鼓励!

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-03 17:33:52数据库技术版块每日发帖之星
日期:2015-09-21 06:20:00
3 [报告]
发表于 2009-02-16 16:22 |只看该作者
学习了。

论坛徽章:
0
4 [报告]
发表于 2009-02-16 16:27 |只看该作者
原帖由 寂寞烈火 于 2009-2-16 16:20 发表
不错不错,加分鼓励!


谢谢鼓励![qq] [/qq]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2009-02-16 16:48 |只看该作者
辛苦了,不过 . source是不发起subshell的

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
6 [报告]
发表于 2009-02-16 16:55 |只看该作者
对于exec调用的子shell(停止当前进程,重新启动一个新进程),只有在主shell中export的变量才能使用,但
     调用后无法再回到主shell

exec也不发起subshell,在当前进程加载起程序

论坛徽章:
0
7 [报告]
发表于 2009-02-16 16:55 |只看该作者
原帖由 waker 于 2009-2-16 16:48 发表
辛苦了,不过 . source是不发起subshell的


是啊,还是没说清楚,不知道该怎么表达!谢谢指正!

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
8 [报告]
发表于 2009-02-16 17:02 |只看该作者
哦啰~~又是一些没注意到的地方.....学习~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP