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