linux中fork, source和exec的区别
shell的命令可以分為內(nèi)部命令和外部命令. 內(nèi)部命令是由特殊的文件格式.def實(shí)現(xiàn)的,如cd,ls等.而外部命令是通過(guò)系統(tǒng)調(diào)用或獨(dú)立程序?qū)崿F(xiàn)的,如awk,sed. source和exec都是內(nèi)部命令.
fork
?? 使用 fork 方式運(yùn)行 script 時(shí), 就是讓 shell(parent process) 產(chǎn)生一個(gè) child process 去執(zhí)行該 script, 當(dāng) child process 結(jié)束后, 會(huì)返回 parent process,但 parent process 的環(huán)境是不會(huì)因 child process 的改變而改變的.
source
?? 使用 source 方式運(yùn)行 script 時(shí), 就是讓 script 在當(dāng)前 process 內(nèi)執(zhí)行, 而不是產(chǎn)生一個(gè) child process 來(lái)執(zhí)行. 由于所有執(zhí)行結(jié)果均于當(dāng)前 process 內(nèi)完成,若 script 的環(huán)境有所改變, 當(dāng)然也會(huì)改變當(dāng)前 process 環(huán)境了.
source ./my.sh 或 . ./my.sh
?
exec
?? 使用 exec 方式運(yùn)行script時(shí), 它和 source 一樣, 也是讓 script 在當(dāng)前process內(nèi)執(zhí)行, 但是 process 內(nèi)的原代碼剩下部分將被終止. 同樣, process 內(nèi)的環(huán)境隨script 改變而改變.
結(jié)論:通常如果我們執(zhí)行時(shí),都是默認(rèn)為fork的。大家可以通過(guò)pstree命令看看關(guān)于父子進(jìn)程的關(guān)系。如上,如果想讓父進(jìn)程得到子進(jìn)程的環(huán)境變量,就是source方式了
* fork ( /directory/script.sh)
??? fork是最普通的, 就是直接在腳本里面用/directory/script.sh來(lái)調(diào)用script.sh這個(gè)腳本.運(yùn)行的時(shí)候開一個(gè)sub-shell執(zhí)行調(diào)用的腳本,sub-shell執(zhí)行的時(shí)候, parent-shell還在。sub-shell執(zhí)行完畢后返回parent-shell. sub-shell從parent-shell繼承環(huán)境變量.但是sub-shell中的環(huán)境變量不會(huì)帶回parent-shell
* source (source /directory/script.sh)
?? 與fork的區(qū)別是不新開一個(gè)sub-shell來(lái)執(zhí)行被調(diào)用的腳本,而是在同一個(gè)shell中執(zhí)行. 所以被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中得到和使用.
* exec (exec /directory/script.sh)
??? exec與fork不同,不需要新開一個(gè)sub-shell來(lái)執(zhí)行被調(diào)用的腳本. 被調(diào)用的腳本與父腳本在同一個(gè)shell內(nèi)執(zhí)行。但是使用exec調(diào)用一個(gè)新腳本以后, 父腳本中exec行之后的內(nèi)容就不會(huì)再執(zhí)行了。這是exec和source的區(qū)別
1.sh?
代碼:?
#!/bin/bash?
A=B?
echo "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=C?
export A?
echo "2.sh: \$A is $A"?
然後,分別跑如下參數(shù)來(lái)觀察結(jié)果:?
$ ./1.sh fork?
$ ./1.sh source?
$ ./1.sh exec
????????????????????site:cu 網(wǎng)中人
轉(zhuǎn)載于:https://blog.51cto.com/dangyibo/1677883
總結(jié)
以上是生活随笔為你收集整理的linux中fork, source和exec的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LVS技术浅析-proc参数
- 下一篇: 性能计数器监控typeperf