一.shell脚本父子进程分析
代码:
#!/bin/bash echo $$ ps -ef |grep `echo $$` echo "-------------------------------------" ( pwd;echo $$;ps -ef |grep `echo $$`;) echo "-------------------------------------" { pwd;echo $$;ps -ef |grep `echo $$`; }
运行结果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;) 语句群时,会再派生一个ID为10771子shell负责执行()内的命令和语句: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环境