在shell指令碼中呼叫另乙個指令碼的三種不同方法(fork, exec, source)
1、fork 呼叫指令碼
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
2、exec 呼叫指令碼
exec (exec /directory/script.sh)
exec與fork不同,不需要新開乙個sub-shell來執行被呼叫的指令碼. 被呼叫的指令碼與父指令碼在同乙個shell內執行。但是使用exec呼叫乙個新指令碼以後, 父指令碼中exec行之後的內容就不會再執行了。這是exec和source的區別
3、source 呼叫指令碼
source (source /directory/script.sh)
與fork的區別是不新開乙個sub-shell來執行被呼叫的指令碼,而是在同乙個shell中執行. 所以被呼叫的指令碼中宣告的變數和環境變數, 都可以在主指令碼中得到和使用.
可以通過下面這兩個指令碼來體會三種呼叫方式的不同:
1、 指令碼1 t1.sh
#!/bin/bash
a=becho "pid for 1.sh before exec/source/fork:$$"
# environment variable
export a
# value of a is b
echo "1.sh: \$a is $a"
case $1 in
exec)
echo "using exec…"
exec ./t2.sh ;;
source)
echo "using source…"
source ./t2.sh ;;
*)echo "using fork by default…"
./t2.sh ;;
esac
echo "pid for 1.sh after exec/source/fork:$$"
echo "1.sh: \$a is $a"
2、 指令碼2 t2.sh
#!/bin/bash
echo "pid for 2.sh: $$"
echo "2.sh get \$a=$a from 1.sh"
a=c#environment variable
export a
echo "2.sh: \$a is $a"
執行結果:
1、預設方式 fork, 在執行呼叫的 sh時 會新開乙個 sub_shell而sub_shell 執行完parent_shell 會繼續執行
[root@localhost src]# sh t1.sh
pid for 1.sh before exec/source/fork:4221
1.sh: $a is b
using fork by default…
pid for 2.sh: 4222
2.sh get $a=b from 1.sh
2.sh: $a is c
pid for 1.sh after exec/source/fork:4221
1.sh: $a is b
2、exec 執行結果 sub_shell 執行完後parent_shell j就不執行了
[root@localhost src]# sh t1.sh exec
pid for 1.sh before exec/source/fork:4263
1.sh: $a is b
using exec…
pid for 2.sh: 4263
2.sh get $a=b from 1.sh
2.sh: $a is c
3、source 不會新開 sub_shell 來執行呼叫的指令碼而是在同乙個shell 中執行
[root@localhost src]# sh t1.sh source
pid for 1.sh before exec/source/fork:4290
1.sh: $a is b
using source…
pid for 2.sh: 4290
2.sh get $a=b from 1.sh
2.sh: $a is c
pid for 1.sh after exec/source/fork:4290
1.sh: $a is c
Linux shell程式設計學習筆記(三) 指令碼引數
1 指令碼傳遞引數測試 bin bash test.sh test pass parameters by wzs 20171021 echo parameters echo 執行指令碼如下 book wzs work tq210 shell test.sh a b c d 2 parameters ...
python 中執行linux shell指令碼
subprocess.popen command,shell true 如果command不是乙個可執行檔案,shell true不可省。最簡單的方法是使用class subprocess.popen command,shell true popen類有popen.stdin,popen.stdou...
linux shell環境以及shell指令碼
1.的區別,中的變數會被解析 中所有的都被當成字串 執行系統命令 2.自定義的變數預設是區域性變數,環境變數是全域性變數。3.export可以把乙個或者多個變數設定為全域性變數 4.父shell中要使用子shell中的變數,必須用export將變數設定為全域性變數 5.常用的環境變數 6.使用者工作...