shell十三问之exec 跟 source 差在哪? 解析
来源:互联网 发布:情义我心知粤语版 编辑:程序博客网 时间:2024/06/05 04:52
exec 跟source 差在哪?
这次先让我们从CU Shell 版的一个实例贴子来谈起吧:
(论坛改版后原连结已经失效 )
例中的提问原文如下:
(意思是:运行脚本后并没有移到/etc/aa/bb/cc 目录)
我当时如何回答暂时别去深究,先让我们了解一下行程(process)的观念好了。
首先,我们所执行的任何程式,都是由父行程(parent process)所产生出来的一个子行程(child process),
子行程在结束后,将返回到父行程去。 此一现像在Linux 系统中被称为 fork 。
(为何要程为fork 呢?嗯,画一下图或许比较好理解... ^_^ )
当子行程被产生的时候,将会从父行程那里获得一定的资源分配、及(更重要的是)继承父行程的环境﹗
让我们回到上一章所谈到的"环境变量"吧:
* 所谓环境变量其实就是那些会传给子行程的变量。
简单而言,"遗传性"就是区分本地变量与环境变量的决定性指标。
然而,从遗传的角度来看,我们也不难发现环境变量的另一个重要特征:
* 环境变量只能从父行程到子行程单向继承。 换句话说:在子行程中的环境如何变更,均不会影响父行程的环境。
接下来,再让我们了解一下命令脚本(shell script)的概念。
所谓的shell script 讲起来很简单,就是将你平时在shell prompt 后所输入的多行command line 依序写入一个文件去而已。
其中再加上一些条件判断、互动界面、参数运用、函数调用等等技巧,得以让script 更加"聪明"的执行,
但若撇开这些技巧不谈,我们真的可以简单的看成script 只不过依次执行预先写好的命令行而已。
再结合以上两个概念(process + script),那应该就不难理解如下这句话的意思了:
* 正常来说,当我们执行一个shell script 时,其实是先产生一个sub-shell 的子行程,然后sub-shell 再去产生命令行的子行程。
然则,那让我们回到本章开始时所提到的例子再从新思考:
我当时的答案是这样的:
能够了解问题的原因及其原理是很好的,但是? 如何解决问题恐怕是我们更感兴趣的﹗ 是吧? ^_^
那好,接下来,再让我们了解一下source 命令好了。
当你有了fork 的概念之后,要理解source 就不难:
* 所谓source 就是让script 在当前shell 内执行、而不是产生一个sub-shell 来执行。
由于所有执行结果均于当前shell 内完成,若script 的环境有所改变,当然也会改变当前环境了﹗
因此,只要我们将原本单独输入的script 命令行变成source 命令的参数,就可轻易解决前例提到的问题了。
比方说,原本我们是如此执行 script 的:
现在改成这样即可:
说到这里,我想,各位有兴趣看看/etc 底下的众多设定文件,
应该不难理解它们被定议后,如何让其他script 读取并继承了吧?
若然,日后你有机会写自己的script ,应也不难专门指定一个设定文件以供不同的script 一起"共用"了... ^_^
okay,到这里,若你搞得懂fork 与source 的不同,那接下来再接受一个挑战:
---- 那exec 又与source/fork 有何不同呢?
哦... 要了解exec 或许较为复杂,尤其扯上File Descriptor 的话...
不过,简单来说:
* exec 也是让script 在同一个行程上执行,但是原有行程则被结束了。
也就是简而言之:原有行程会否终止,就是exec 与source/fork 的最大差异了。
嗯,光是从理论去理解,或许没那么好消化,不如动手"实作+思考"来的印象深刻哦。
下面让我们写两个简单的script ,分别命名为1.sh 及2.sh :
1.sh
2.sh
然后,分别跑如下参数来观察结果:
这次先让我们从CU Shell 版的一个实例贴子来谈起吧:
(论坛改版后原连结已经失效 )
例中的提问原文如下:
(意思是:运行脚本后并没有移到/etc/aa/bb/cc 目录)
我当时如何回答暂时别去深究,先让我们了解一下行程(process)的观念好了。
首先,我们所执行的任何程式,都是由父行程(parent process)所产生出来的一个子行程(child process),
子行程在结束后,将返回到父行程去。 此一现像在Linux 系统中被称为 fork 。
(为何要程为fork 呢?嗯,画一下图或许比较好理解... ^_^ )
当子行程被产生的时候,将会从父行程那里获得一定的资源分配、及(更重要的是)继承父行程的环境﹗
让我们回到上一章所谈到的"环境变量"吧:
* 所谓环境变量其实就是那些会传给子行程的变量。
简单而言,"遗传性"就是区分本地变量与环境变量的决定性指标。
然而,从遗传的角度来看,我们也不难发现环境变量的另一个重要特征:
* 环境变量只能从父行程到子行程单向继承。 换句话说:在子行程中的环境如何变更,均不会影响父行程的环境。
接下来,再让我们了解一下命令脚本(shell script)的概念。
所谓的shell script 讲起来很简单,就是将你平时在shell prompt 后所输入的多行command line 依序写入一个文件去而已。
其中再加上一些条件判断、互动界面、参数运用、函数调用等等技巧,得以让script 更加"聪明"的执行,
但若撇开这些技巧不谈,我们真的可以简单的看成script 只不过依次执行预先写好的命令行而已。
再结合以上两个概念(process + script),那应该就不难理解如下这句话的意思了:
* 正常来说,当我们执行一个shell script 时,其实是先产生一个sub-shell 的子行程,然后sub-shell 再去产生命令行的子行程。
然则,那让我们回到本章开始时所提到的例子再从新思考:
我当时的答案是这样的:
能够了解问题的原因及其原理是很好的,但是? 如何解决问题恐怕是我们更感兴趣的﹗ 是吧? ^_^
那好,接下来,再让我们了解一下source 命令好了。
当你有了fork 的概念之后,要理解source 就不难:
* 所谓source 就是让script 在当前shell 内执行、而不是产生一个sub-shell 来执行。
由于所有执行结果均于当前shell 内完成,若script 的环境有所改变,当然也会改变当前环境了﹗
因此,只要我们将原本单独输入的script 命令行变成source 命令的参数,就可轻易解决前例提到的问题了。
比方说,原本我们是如此执行 script 的:
现在改成这样即可:
说到这里,我想,各位有兴趣看看/etc 底下的众多设定文件,
应该不难理解它们被定议后,如何让其他script 读取并继承了吧?
若然,日后你有机会写自己的script ,应也不难专门指定一个设定文件以供不同的script 一起"共用"了... ^_^
okay,到这里,若你搞得懂fork 与source 的不同,那接下来再接受一个挑战:
---- 那exec 又与source/fork 有何不同呢?
哦... 要了解exec 或许较为复杂,尤其扯上File Descriptor 的话...
不过,简单来说:
* exec 也是让script 在同一个行程上执行,但是原有行程则被结束了。
也就是简而言之:原有行程会否终止,就是exec 与source/fork 的最大差异了。
嗯,光是从理论去理解,或许没那么好消化,不如动手"实作+思考"来的印象深刻哦。
下面让我们写两个简单的script ,分别命名为1.sh 及2.sh :
1.sh
2.sh
然后,分别跑如下参数来观察结果:
原文网址:
http://bbs.chinaunix.net/viewthread.php?tid=218853&extra=&page=6#pid1583329
0
上一篇:2.6内核字符设备驱动程序解析(续)
下一篇:linux2.6.28-tty设备驱动学习(一)
相关热门文章
- 承接自动化测试培训、外包、实...
- Solaris PowerTOP 1.0 发布
- For STKMonitor
- busybox的httpd使用CGI脚本(Bu...
- 项目小体会
- 初学UNIX环境高级编程的,关于...
- chinaunix博客什么时候可以设...
- 一个访问量较大网站的服务器。...
- 收音机驱动与v4l2架构的关系,...
- 如何将linux驱动改为裸机驱动(...
给主人留下些什么吧!~~
评论热议
0 0
- shell十三问之exec 跟 source 差在哪? 解析
- SHELL十三问之六:exec 跟 source 差在哪?
- Shell十三问之六:exec跟source差在哪
- shell十三问之6:exec跟source差在哪?
- shell 十三問之六—— exec 跟 source 差在哪?
- shell十三问之14: [^ ] 跟[! ]差在哪? (wildcard)
- shell十三问之15: [^ ] 跟[! ]差在哪? (RE: Regular Expression)
- SHELL十三问之七:( ) 与 { } 差在哪?
- SHELL十三问之八:$(( )) 与 $( ) 还有${ } 差在哪?
- SHELL十三问之九:$@ 与 $* 差在哪?
- SHELL十三问之十:&& 与 || 差在哪?
- SHELL十三问之十一:> 与 < 差在哪?
- Shell十三问之七:()与{}差在哪
- Shell十三问之八:$(())与$()还有${}差在哪
- Shell十三问之九:$@与$*差在哪
- Shell十三问之十:&&与||差在哪
- Shell十三问之十一:>与<差在哪
- SHELL十三问之八:$(( )) 与 $( ) 还有${ } 差在哪?
- linux下串口下载工具
- 回调函数解析
- 记住这些话 他会帮你变得更完美
- 读《C缺陷与陷阱》之-函数声明理解
- 2.6内核字符设备驱动程序解析(续)
- shell十三问之exec 跟 source 差在哪? 解析
- linux2.6.28-tty设备驱动学习(一)
- linux2.6.28-tty设备驱动学习(二)
- Linux2.6 DM9000驱动模编译为模块
- 字符设备的信号量,阻塞和非阻塞,poll实现
- 进程间通信--信号量+共享内存
- ps -aux 详解
- 从PC总线到ARM的内部总线
- 控制函数assert.h, setjmp.h和signal.h
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
中海半山华府
中广西苑华府
恒大华府楼盘
华盛顿
哥伦比亚特区
华盛顿哥伦比亚特区
华盛顿图片
华盛顿特区
金都
北京万科金域华府
华康
华康字体
华康利爽
华康海报体
华康挂号
华康少女
华康少女字体
佛山华康医院可靠吗
华康人寿保险
澄海华康医院
佛山男科医院细心华康
深圳华强
华强北商城
华强网
华强
深圳华强北
华强方特
华强集团
袁华强
华强北手机
华强北街道
华强北在哪
华强城
华强广场
华强北耳机
华强北报价
南通华强城
任华强
华强招聘
华强电子
华强招聘网