在linux裏,source、sh、bash、./均可以執行shell script文件,那它們有什麼不一樣嗎?php
-----------linux
一、sourceshell
source a.sh
在當前shell內去讀取、執行a.sh,而a.sh不須要有"執行權限"bash
source命令能夠簡寫爲"."post
. a.sh
注意:中間是有空格的。spa
二、sh/bash.net
sh a.sh bash a.sh
都是打開一個subshell去讀取、執行a.sh,而a.sh不須要有"執行權限"unix
一般在subshell裏運行的腳本里設置變量,不會影響到父shell的。code
三、./blog
./a.sh #bash: ./a.sh: 權限不夠 chmod +x a.sh ./a.sh
打開一個subshell去讀取、執行a.sh,但a.sh須要有"執行權限"
能夠用chmod +x添加執行權限
四、fork、source、exec
一般若是咱們執行時,都是默認爲fork的。
爲了實踐下,咱們能夠先創建2個sh文件,如下代碼來自ChinaUnix的網中人:
1.sh
#!/bin/bash A=B echo "PID for 1.sh before exec/source/fork:$$" export A echo "1.sh: \$A is $A" case $1 in exec) echo "using exec..." exec ./2.sh ;; source) echo "using source..." . ./2.sh ;; *) echo "using fork by default..." ./2.sh ;; esac echo "PID for 1.sh after exec/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"
本身運行下,觀看結果吧 :)
chmod +x 1.sh chmod +x 2.sh ./1.sh fork ./1.sh source ./1.sh exec