exec和source都屬于bash內(nèi)部命令(builtins commands),在bash下輸入man exec或man source可以查看所有的內(nèi)部命令信息。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了四川免費建站歡迎大家使用!
bash shell的命令分為兩類:外部命令和內(nèi)部命令。外部命令是通過系統(tǒng)調(diào)用或獨立的程序?qū)崿F(xiàn)的,如sed、awk等等。內(nèi)部命令是由特殊的文件格式(.def)所實現(xiàn),如cd、history、exec等等。
在說明exec和source的區(qū)別之前,先說明一下fork的概念。
fork是linux的系統(tǒng)調(diào)用,用來創(chuàng)建子進(jìn)程(child process)。子進(jìn)程是父進(jìn)程(parent process)的一個副本,從父進(jìn)程那里獲得一定的資源分配以及繼承父進(jìn)程的環(huán)境。子進(jìn)程與父進(jìn)程唯一不同的地方在于pid(process id)。
環(huán)境變量(傳給子進(jìn)程的變量,遺傳性是本地變量和環(huán)境變量的根本區(qū)別)只能單向從父進(jìn)程傳給子進(jìn)程。不管子進(jìn)程的環(huán)境變量如何變化,都不會影響父進(jìn)程的環(huán)境變量。
shell script:
有兩種方法執(zhí)行shell scripts,一種是新產(chǎn)生一個shell,然后執(zhí)行相應(yīng)的shell scripts;一種是在當(dāng)前shell下執(zhí)行,不再啟用其他shell。
新產(chǎn)生一個shell然后再執(zhí)行scripts的方法是在scripts文件開頭加入以下語句
#!/bin/sh
一般的script文件(.sh)即是這種用法。這種方法先啟用新的sub-shell(新的子進(jìn)程),然后在其下執(zhí)行命令。
另外一種方法就是上面說過的source命令,不再產(chǎn)生新的shell,而在當(dāng)前shell下執(zhí)行一切命令。
source:
source命令即點(.)命令。
在bash下輸入man source,找到source命令解釋處,可以看到解釋"Read and execute commands from filename in the current shell environment and ..."。從中可以知道,source命令是在當(dāng)前進(jìn)程中執(zhí)行參數(shù)文件中的各個命令,而不是另起子進(jìn)程(或sub-shell)。source filename or .filename 執(zhí)行filename中的命令。
exec:
在bash下輸入man exec,找到exec命令解釋處,可以看到有"No new process is created."這樣的解釋,這就是說exec命令不產(chǎn)生新的子進(jìn)程。那么exec與source的區(qū)別是什么呢?
exec命令在執(zhí)行時會把當(dāng)前的shell process關(guān)閉,然后換到后面的命令繼續(xù)執(zhí)行。
======================================================================================================================
下面我們寫個腳本來測試一下,這樣你就會很容易的讀懂我上面所說的東西~
1.sh
#!/bin/bashA=Becho?"PID?for?1.sh?before?exec/source/fork:
"exportAecho"1.sh:$Ais$A"case$1inexec)echo"usingexec..."exec./2.sh;;source)echo"usingsource..."../2.sh;;?)echo"usingforkbydefault..."./2.sh;;esacecho"PIDfor1.shafterexec/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"
=================》》》》》》》》》》》
測試結(jié)果:
[root@node2 ~]$ ./1.sh fork
PID for 1.sh before exec/source/fork:10175
1.sh: $A is B
using fork by default...
PID for 2.sh:?10176
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:10175
1.sh: $A is B
=============================================
[root@node2 ~]$ ./1.sh source
PID for 1.sh before exec/source/fork:10185
1.sh: $A is B
using source...
PID for 2.sh:?10185
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:10185
1.sh: $A is C
=============================================
[root@node2 ~]$ ./1.sh exec
PID for 1.sh before exec/source/fork:10194
1.sh: $A is B
using exec...
PID for 2.sh:?10194
2.sh get $A=B from 1.sh
2.sh: $A is C
[cpsuser@cps-svr-153 zy]$
=============================================
從以上結(jié)果可以看出:
1.執(zhí)行source和exec的過程中沒有產(chǎn)生新的進(jìn)程,而fork是默認(rèn)的運行方式,在運行的過程中會產(chǎn)生新的進(jìn)程,也就是子進(jìn)程
2.source和exec的區(qū)別在于exec執(zhí)行完畢后沒有輸出進(jìn)程,也就是說運行完畢2.sh后直接退出了,沒有返回1.sh
3.fork和source的最后一句輸出分別為:1.sh: $A is B (fork,說明它運行的環(huán)境不一樣,要不然輸出的應(yīng)該是C)
1.sh: $A is C(source,說明從始至終都是在一個shell中執(zhí)行)
小節(jié):
source 指定腳本中的命令在同一個shell中運行。(默認(rèn)shell中的命令都是創(chuàng)建sub-shell,然后執(zhí)行。執(zhí)行完后,返回父shell)
fork 就是創(chuàng)建sub-shell運行腳本中的命令,和默認(rèn)運行方式相同。
exec 和source相似,區(qū)別就是,運行完畢命令后退出,不會返回父shell
額........每啟動一個進(jìn)程并不一定要執(zhí)行fork.fork只是系統(tǒng)最后封裝的一個系統(tǒng)調(diào)用.你在程序里不使用fork的話.使用其它方式啟動進(jìn)程.就不是fork.fork族里有很多函數(shù)...............exec也可替換當(dāng)前進(jìn)程......系統(tǒng)內(nèi)核里生成一個進(jìn)程用的是clone這個函數(shù).
就比如要蓋個房子.一個人干,要先挖土再調(diào)水泥再擺磚頭再蓋墻這樣一步一步做.但是如果有多個人.就是可以多個人同時做這些事,一個挖土,一個調(diào)水泥.一個擺磚頭.這樣就省了很多時間.進(jìn)程也是如此.fork的作用就是創(chuàng)建新進(jìn)程.
這么多人一起蓋房子,總不能各自蓋各自的,需要大家協(xié)調(diào)來做.不能土沒挖好就擺磚,沒放磚就抹水泥一樣.這個時候需要一個工頭來管理大家.工頭通過每個人的名字來指揮每個人干活.進(jìn)程就通過pid來指揮一個進(jìn)程干活.工人需要知道自己的工頭是誰,好向他報告碰到的情況.進(jìn)程需要知道自己的父進(jìn)程是誰報告自己的情況.
這樣就明白fork為何要返回進(jìn)程的id了吧?fork是不會返回父進(jìn)程的id的.
工頭找了一個新工人干活.從工頭知道這個新工人的名字時刻開始,新工人就會投入這個團隊一起干活了.fork返回pid的時候就表示這個進(jìn)程在這個進(jìn)程團隊里了.工頭可以直接告訴工人要干什么而不會讓其他工人誤以為這是自己的活.但是程序并沒有這么智能.這個時候就需要有一個狀態(tài)(if(!pid){....這是工人干的活...})表明這個工人的代碼從什么位置開始,到什么位置結(jié)束.
= OR ==
你初學(xué)者吧,請把賦值 =
和 == 值比較 搞清楚啊
= value assignment
== value compare
名稱欄目:linux的fork命令,linux中fork函數(shù)詳解原創(chuàng)!!實例講解
分享鏈接:http://aaarwkj.com/article2/hsoioc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、外貿(mào)建站、小程序開發(fā)、微信小程序、品牌網(wǎng)站設(shè)計、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)