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