shell編程的時(shí)候,往往不會(huì)把所有功能都寫在一個(gè)腳本中滤否,這樣不太好維護(hù)脸狸,需要多個(gè)腳本文件協(xié)同工作。
那么問題來了藐俺,在一個(gè)腳本中怎么調(diào)用其他的腳本呢炊甲?
有三種方式,分別是fork欲芹、source和exec卿啡。
1. fork
即通過sh 腳本名進(jìn)行執(zhí)行腳本的方式。
下面通過一個(gè)簡單的例子來講解下它的特性菱父。
創(chuàng)建father.sh颈娜,內(nèi)容如下:
#!/bin/bash
echo "父shell進(jìn)程開始執(zhí)行"
sh son.sh #父shell fork子shell環(huán)境執(zhí)行另一個(gè)腳本
echo "父shell進(jìn)程執(zhí)行完畢"
創(chuàng)建son.sh,內(nèi)容如下:
#!/bin/bash
echo "子shell被調(diào)用"
執(zhí)行sh father.sh:
[wangsl@wangsl]# sh father.sh
父shell進(jìn)程開始執(zhí)行
子shell被調(diào)用
父shell進(jìn)程執(zhí)行完畢
通過以上例子浙宜,可以知道fork的特性為:
在一個(gè)腳本中調(diào)用另一個(gè)腳本官辽,被調(diào)用腳本執(zhí)行完成之后返回給父shell進(jìn)程,父shell進(jìn)程繼續(xù)執(zhí)行剩下的指令
2. source
即通過source或. 腳本名進(jìn)行執(zhí)行腳本的方式粟瞬。
下面通過一個(gè)簡單的例子來講解下它的特性同仆。
創(chuàng)建father.sh,內(nèi)容如下:
#!/bin/bash
source son.sh
#通過source方式將son.sh加載到當(dāng)前shell環(huán)境中
echo "father訪問son中定義的局部變量:$sonVar"
創(chuàng)建son.sh裙品,內(nèi)容如下:
#!/bin/bash
sonVar="son var"
echo "son定義了一個(gè)變量:sonVar=$sonVar"
執(zhí)行sh father.sh:
[wangsl@wangsl]# sh father.sh
son定義了一個(gè)變量:sonVar=son var
father訪問son中定義的局部變量:son var
通過以上例子俗批,可以知道source的特性為:
source調(diào)用,是把被調(diào)用腳本加載到當(dāng)前的shell環(huán)境中來執(zhí)行市怎,就好像是在一個(gè)腳本里面運(yùn)行一樣岁忘,他們的定義的局部變量共享
3. exec
即通過exec 腳本名進(jìn)行執(zhí)行腳本的方式。
下面通過一個(gè)簡單的例子來講解下它的特性焰轻。
創(chuàng)建father.sh臭觉,內(nèi)容如下:
#!/bin/bash
echo "父shell開始執(zhí)行"
exec sh son.sh
echo "父shell完成執(zhí)行昆雀,但是這句話不會(huì)被執(zhí)行"
創(chuàng)建son.sh辱志,內(nèi)容如下:
#!/bin/bash
echo "子shell被父shell exec調(diào)用,執(zhí)行權(quán)已經(jīng)被搶占過來了狞膘,不會(huì)在交回給父shell進(jìn)程"
執(zhí)行sh father.sh:
[wangsl@wangsl]# sh father.sh
父shell開始執(zhí)行
子shell被父shell exec調(diào)用揩懒,執(zhí)行權(quán)已經(jīng)被搶占過來了,不會(huì)在交回給父shell進(jìn)程
通過以上例子挽封,可以知道exec的特性為:
exec調(diào)用已球,也是fork一個(gè)子shell環(huán)境來執(zhí)行被調(diào)用腳本,但是父shell環(huán)境的執(zhí)行權(quán)會(huì)被剝奪,也就是執(zhí)行權(quán)被交給了被調(diào)用腳本智亮,父shell環(huán)境不再擁有執(zhí)行權(quán)忆某,無論父shell腳本中的指令是否執(zhí)行完成,都不在被執(zhí)行阔蛉,隨著子shell進(jìn)程的結(jié)束而結(jié)束弃舒。