关于尚观
最新课程体系
企业服务
零起点咨询
开放课程
报名咨询
免费资源申请
授权加盟
学员专区&薪资
认证课程
  • 尚观首页
  • 尚观简介
  • 师资力量
  • 尚观文化
  • 尚观动态
  • 加入尚观
  • 联系我们
  • 珍贵瞬间
  • Linux系统与集群
  • 数据库集群架构师
  • 嵌入式内核驱动开发
  • 服务器开发架构师
  • 研发型测试架构师
  • RHCE/LPI认证体系
  • Oracle OCP认证
  • 企业高级技术培训
  • 批量人才供应及研发团队建设
  • 软件外包及研发项目合作
  • 人力外包及人力供应
  • 猎头服务
  • 开启职业生涯
  • 如何入门
  • Unix/Linux职业方向
  • 嵌入式职业方向
  • 集群(Cluster)Oracle(DBA)方向
  • 新手专栏
  • Unix/Linux新手专栏
  • Unix/Linux管理
  • 嵌入式及POSIX开发
  • Linux开源文化及市场
  • 最近网络课堂
  • P2P教学视频
  • 精彩Linux培训视频
  • 零起点数据库集群(长期)
  • 嵌入式驱动(长期)
  • Linux金牌三证(RHCE级)
  • Linux架构师(RHCA级)
  • 嵌入式/驱动加速课程
  • 其他咨询
  • Linux免费网络安全公开课
  • 免费Linux资料申请
  • 免费Linux安全&DDOS防御课程
  • 免费嵌入式Linux开发课程
  • 免费Linux网络安全机制
  • 授权加盟&报名点申请
  • 如何加盟
  • 我们的优势
  • 成功案例
  • 行业市场分析
  • 授权加盟中心
  • 学员毕业薪资(不断更新中)
  • 加入尚观猎头服务(仅限老学员)
  • 学员交流论坛
  • OCP认证
  • Intel认证
  • RHCE认证
  • RHCE+OCP
  • RHCE+LPI


    您现在的位置:尚观Linux培训 - 嵌入式Linux培训专家尚观Linux培训 » UNIX/Linux新手专栏 » 从学习export命令理解到的Shell环境和变量生存期

从学习export命令理解到的Shell环境和变量生存期

 
咨询热线
  • 免费咨询电话:
    400-700-0056
    800-810-0056

    教学就业监督电话:
    400-810-3016
  • QQ在线咨询:
    517589021 在线咨询
    82555789 在线咨询
    962895738 在线咨询


  • MSN在线咨询:
    upadv05@hotmail.com
    upadv20@hotmail.com
免费资源
  • -3月13日
  • [沈阳]Linux嵌入式-3月20日
  • [上海]DDos攻防-3月20日
  • [上海]Linux嵌入式-3月13日
  • [深圳]DDos攻防-3月20日
  • [深圳]Linux嵌入式-3月13日
  • [北京]DDos攻防-3月13日
五万年薪就业保证课程
  • UTA-高级研发型测试架构师
  • UDA-Linux服务器开发架构师
  • UEA-嵌入式内核驱动开发者
  • UOA-Oracle数据库集群架构
  • ULA-Linux系统与集群架构师
八万年薪就业保证课程
  • UOM- Oracle集群大师
  • UEM-嵌入式开发大师
Linux培训●最新开班
  • [沈阳]UEA课程3月班热招!
  • [沈阳]ULA课程3月班热招!
  • [北京]UEA课程3月班热报!
  • [北京]UOA/ULA课程1月班!
  • [上海]UEA课程3月班热招!
  • [上海]ULA/UOA课程1月班!
  • [深圳]UEA课程3月班热招!
  • [深圳]ULA/UOA课程1月班!
 
文章内容
  • 我自己也是一个菜鸟,接触linux没有多久,最近在学习BASH的export命令时碰到了一个难道(书上说export是将自定义变量变成系统环境变量):我在一个脚本文件中定义一个了变量,然后export变量,按照我自己的想法,执行完这个脚本后,在提示符下一定可以用echo显示出它的值,可结果却不是这样,脚本执行完后用set根本看不到有这个变量存在。为什么呢?我百思不得其解,最后将问题贴出来,一位前辈告诉我说用source+脚本文件就可以了,我试了一下果然可以,但一个新的问题又出来了。我将脚本中export命令删除后,用source一样可以。那这个export好像没有什么用呀。
    在经过多次尝试后发现了一些东西,是我自己猜的,如果有什么不对的地方,请指正,谢谢。
    执行一个脚本时,会先开启一个子shell环境(不知道执行其它程序是不是这样),然后将父shell中的所有系统环境变量复制过来,这个脚本中的语句就在子shell中执行。(也就是说父shell的环境变量在子shell中可以调用,但反过来就不行,如果在子shell中定义了环境变量,只对该shell或者它的子shell有效,当该子shell结束时,也可以理解为脚本执行完时,变量消失。)为了证明这一点,请看脚本内容:
    test='value'
    export test
    这样的脚本执行完后,test实际上是不存在的。接着看下面的:
    test='value'
    export test
    bash
    这里在脚本最后一行再开一个子shell,该shell应该是脚本文件所在shell的子shell,这个脚本执行完后,是可以看到test这个变量的,因为现在是处于它的子shell中,当用exit退出子shell后,test变量消失。
    如果用source对脚本进行执行时,如果不加export,就不会在子shell中看到这个变量,因为它还不是一个系统环境变量呀,如脚本内容是:
    test='value'
    用source执行后,在shell下是能看到这个变量,但再执行bash开一个子shell时,test是不会被复制到子shell中的,因为执行脚本文件其实也是在一个子shell中运行,所以我再建另一个脚本文件执行时,是不会输入任何东西的,内容如:echo $test。所以这点特别注意了,明明在提示符下可以用echo $test输出变量值,为什么把它放进脚本文件就不行了呢?
    所以得出的结论是:1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;2、一个shell中的系统环境变量才会被复制到子shell中(用export定义的变量);3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。3、不用export定义的变量只对该shell有效,对子shell也是无效的。
    后来根据版主的提示,整理了一下贴子:为什么一个脚本直接执行和用source执行不一行呢?这也是我自己碰到的一个问题。manual原文是这样的:Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.明白了为什么不一样了吧?直接执行一个脚本文件是在一个子shell中运行的,而source则是在当前shell环境中运行的。根据前面的内容,你也已经明白其中的道理了吧。
    困扰了我几天的问题终于可以圆满的解决了。


    精彩Linux视频,免费先学!

    查看:尚观Linux培训学员最新就业薪资待遇统计报告!

    查看:UTA-高级研发型测试架构师大纲
    查看:UDA-Linux服务器开发架构师大纲
    查看:UEA-嵌入式内核驱动开发者大纲
    查看:UOA-Oracle数据库集群架构大纲
    查看:ULA-Linux系统与集群架构师大纲

    填表获取 Linux、嵌入式、Oracle 技术资料

  • 姓    名:
  • 固    话:
  • 手    机:
  • E-Mail :
  • 所在地:
  •         

北京(Beijing)

电子地图
电话:(010)62113016/17 68949060
地址:北京市 海淀区中关村南大街 甲10号 银海大厦南区410-418

上海(Shanghai)

电子地图
电话:(021)54510580 54070058
报名:徐汇区 华山路2088号 汇银广场南楼1307室
校区:漕河泾开发区 钦江路333号38号3楼

深圳(Shenzhen)

电子地图
电话:(0755)82995128 82995168
地址:深圳市 福田区 彩田路 中深花园B2005室

沈阳(Shenyang)

电子地图
电话:(024)31500816 31500817
地址:沈阳市和平区三好街54号物产科贸大厦2号楼201室

成都(Chengdu)

电子地图
电话:(028)66677820 66677828 66677829
地址:成都市青羊区上西顺城街252号顺吉大厦8楼A3


2005-2009高新技术企业

LPI授权培训考试中心

国家紧缺人才培养工程合作伙伴

CSDN战略伙伴

51Job战略伙伴

Oracle WDP授权培训与考试中心

Intel软件服务培训供应商

Redhat授权培训与考试中心

国家高新技术企业认证
 

友情链接:   LPI  RedHat  CSDN  ChinaUnix  ITPub  Eygle.Com  PHP中国  嵌入式世界  Linux培训  嵌入式培训  嵌入式在线  oklinux 
Linux联盟  Linux中国  Unix爱好者家园  ZOL服务器  php爱好者  看看Linux  嵌入式技术网  虚拟主机评测  大功率LED网   搜电网   深圳公交查询   杭州写字楼网  互联网百科  苏州人才网  Linux技术中心  泉州人才网  广州招聘网  天天健康  上海商铺  北京赶集网  SVN中文技术网  中国别墅网  网罗天下  工具软件下载  Oracle视频教程  北京法律咨询  天津赶集网  嵌入式资讯网  天极导航  Fedora中文爱好者 (申请友情链接请发信至:info#uplooking.com)


COPYRIGHT © 2000-2009 北京尚观科技有限公司 - Linux培训及嵌入式培训专家 ALL RIGHTS RESERVED

咨询热线:400-700-0056    800-810-0056
京ICP备05058027号 | Linux就业信息 | 免责声明 |