fork使用 fork 方式執行 script 時, 就是讓 shell(parent process) 產生乙個 child
process 去執行該 script, 當 child process 結束後, 會返回 parent process,
但 parent process 的環境是不會因 child process 的改變而改變的.
source
使用 source 方式執行 script 時, 就是讓 script 在當前 process 內執行, 而不
是產生乙個 child process 來執行. 由於所有執行結果均於當前 process 內完成,
若 script 的環境有所改變, 當然也會改變當前 process 環境了.
exec
使用 exec 方式執行script時, 它和 source 一樣, 也是讓 script 在當前process
內執行, 但是 process 內的原**剩下部分將被終止. 同樣, process 內的環境隨
script 改變而改變.
*
fork
(/directory/script.sh)
fork是最普通的, 就是直接在指令碼裡面用/directory/script.sh來呼叫script.sh這個指令碼.
執行的時候開乙個sub-shell執行呼叫的指令碼,sub-shell執行的時候, parent-shell還在。
sub-shell執行完畢後返回parent-shell.
sub-shell從parent-shell繼承環境變數.但是sub-shell中的環境變數不會帶回parent-shell
*exec
(exec
/directory/script.sh)
exec與fork不同,不需要新開乙個sub-shell來執行被呼叫的指令碼. 被呼叫的指令碼與父指令碼在同乙個shell內執行。但是使用exec呼叫乙個新指令碼以後, 父指令碼中exec行之後的內容就不會再執行了。這是exec和source的區別
*source (source /directory/script.sh)
與fork的區別是不新開乙個sub-shell來執行被呼叫的指令碼,而是在同乙個shell中執行. 所以被呼叫的指令碼中宣告的變數和環境變數, 都可以在主指令碼中得到和使用.
可以通過下面這兩個指令碼來體會三種呼叫方式的不同:
1.sh
#!/bin/bash
a=becho "pid for 1.sh before exec/source/fork:$$"
export a
echo "1.sh: \$a is $a"
case $
1 in
exec
)echo "using exec…"
exec
./2.sh ;
;source)
echo "using source…"..
/2.sh ;;*
)echo "using fork by default…"
./2.sh ;
;esac
echo "pid for 1.sh after exec/source/fork:$$"
echo "1.sh: \$a is $a"
2.sh
#!/bin/bash
echo "pid for 2.sh: $$"
echo "2.sh get \$a=$a from 1.sh"
a=cexport a
echo "2.sh: \$a is $a"
執**況:$.
/1.sh
pid for 1.sh before exec
/source/
fork
:5845364
1.sh:
$a is b
using fork by default…
pid for 2.sh: 5242940
2.sh get $
a=b from 1.sh
2.sh:
$a is c
pid for 1.sh after exec
/source/
fork
:5845364
1.sh:
$a is b$.
/1.sh exec
pid for 1.sh before exec
/source/
fork
:5562668
1.sh:
$a is b
using exec…
pid for 2.sh: 5562668
2.sh get $
a=b from 1.sh
2.sh:
$a is c$.
/1.sh source
pid for 1.sh before exec
/source/
fork
:5156894
1.sh:
$a is b
using source…
pid for 2.sh: 5156894
2.sh get $
a=b from 1.sh
2.sh:
$a is c
pid for 1.sh after exec
/source/
fork
:5156894
1.sh:
$a is c
$
Shell中fork source exec的區別
fork是linux的系統呼叫,用來建立子程序,子程序是父程序的乙個副本,從父程序那裡獲得一定的資源分配以及繼承父程序的環境。子程序與父程序唯一不同的地方在於pid process id 環境變數 傳給子程序的變數,遺傳性是本地變數和環境變數的根本區別 只能單向從父程序傳給子程序。不管子程序的環境變...
堆區 棧區 靜態區 常量區還有???
常見的儲存區域可分為 由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,程式會一直占用記憶體,導致記憶體洩漏...
c 棧區 堆區 常量區
c 中棧區 堆區 常量區 由一道面試題目而學習 2009 04 28 21 01 include void main 對應的彙編 10 a c 1 00401067 8a 4d f1 mov cl,byte ptr ebp 0fh 0040106a 88 4d fc mov byte ptr ebp...