1. fork ( /directory/script.sh) :若是shell中包含執行命令,那麼子命令並不影響父級的命令,在子命令執行完後再執行父級命令。子級的環境變量不會影響到父級。 shell
fork是最普通的, 就是直接在腳本里面用/directory/script.sh來調用script.sh這個腳本.bash
運行的時候開一個sub-shell執行調用的腳本,sub-shell執行的時候, parent-shell還在。ide
sub-shell執行完畢後返回parent-shell. sub-shell從parent-shell繼承環境變量.可是sub-shell中的環境變量不會帶回parent-shellspa
2. exec (exec /directory/script.sh):執行子級的命令後,再也不執行父級命令。orm
exec與fork不一樣,不須要新開一個sub-shell來執行被調用的腳本. 被調用的腳本與父腳本在同一個shell內執行。可是使用exec調用一個新腳本之後, 父腳本中exec行以後的內容就不會再執行了。這是exec和source的區別繼承
3. source (source /directory/script.sh):執行子級命令後繼續執行父級命令,同時子級設置的環境變量會影響到父級的環境變量。進程
與fork的區別是不新開一個sub-shell來執行被調用的腳本,而是在同一個shell中執行. 因此被調用的腳本中聲明的變量和環境變量, 均可以在主腳本中獲得和使用.ip
能夠經過下面四個腳本體會一下結果:it
1, source_1.sh class
#!/bin/bash
echo "source 2.sh begin"
export a=1
source ./2.sh
echo "1.sh b is $b"
echo "source 2.sh end"
2. exec_1.sh
#!/bin/bash
echo "exec 2.sh begin"
export a=1
exec ./2.sh
echo "1.sh b is $b"
echo "exec 2.sh end"
3. fork_1.sh
#!/bin/bash
echo "fork 2.sh begin"
export a=1
sh ./2.sh
echo "1.sh b is $b"
echo "fork 2.sh end"
4. 2.sh
#!/bin/bash
b=2
echo "a is $a"
echo "b is $b"
運行結果是:
source 會回傳變量值
fork 不回傳變量
exec 不回傳變量,執行完本命令結束父進程