Linux Shell脚本文件执行分析

2014-11-24 10:14:46 · 作者: · 浏览: 0

一.shell脚本父子进程分析


代码:


运行结果1



结果分析1


1. 最后一行显示当前登录shell进程ID为9561;


2. 第三行显示登录shell派生出一个进程ID为10767的shell执行进程;该进程负责扫描shell脚本进行执行;


3. 10767脚本执行进程负责逐行执行脚本:遇到内置命令直接在当10767进程中执行,遇到可执行程序就fork 新的子进进程来执行。


4. 进程号为 10768和10769的进程都是执行shell 10767进程派生的子进程ps 和grep .


5. 10767脚本执行进程扫描到( com1;com2;) 语句群时,会再派生一个ID10771shell负责执行()内的命令和语句:10771 逐行扫描()中的语句,按照步骤3的规则进行处理:进程号 10773 grep 还有另一个进程 ps 都是10771又派生出的子进程,ps子进程的父进程是10771 此处没有显示出来。


6. 10767脚本执行进程扫描到{ com1;com2;} 语句时,不会新派生子shell,直接使用当前进程10767进行负责逐行执行脚本。


运行结果2



结果分析2


其运行结果和运行1是一样的,bash cpro.sh 和直接运行cpro.sh 的工作机制是一样的,都会派生出一个执行shell,逐行读脚本进行执行;


总结:


在当前shell中执行内部命令不会派生子shell,因此有些内部命令才能够改变当前的shell执行环境;


在当前shell中执行外部命令或脚本时会派生子shell,所以这时命令的执行不会影响当前shell环境;


要想在当前shell中执行脚本,而不派生子shell,可以使用 . 和source 命令 + 脚本名进行执行


./command.sh = bash ./command.sh 当前shell会派生子shell执行脚本文件,脚本的执行不会影响到当前shell环境


. ./command.sh = source ./command.sh 直接在当前shell中执行脚本,脚本的执行回影响到当前shell环境