Linux Shell脚本文件执行分析


一.shell脚本父子进程分析

代码:

  1. #!/bin/bash   
  2. echo $$  
  3. ps -ef |grep `echo $$`  
  4. echo "-------------------------------------"  
  5. ( pwd;echo $$;ps -ef |grep `echo $$`;)  
  6. echo "-------------------------------------"  
  7. { 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;) 语句群时,会再派生一个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环境

  • 1
  • 2
  • 下一页

相关内容