歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

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;) 語句群時,會再派生一個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環境

Copyright © Linux教程網 All Rights Reserved