linux shell 程式設計 10 指令碼中呼叫指令碼

2021-07-09 19:53:58 字數 2430 閱讀 4062

在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.使用者工作...