1. 程式人生 > >Shell指令碼程式設計之(三)執行方式差異(source, sh script, ./script)

Shell指令碼程式設計之(三)執行方式差異(source, sh script, ./script)

利用直接方式或bash執行

該 指令碼 都會使用一個新的 bash 環境來執行指令碼內的指令!也就是說,使用這種執行方式時, 其實 script 是在子程式的 bash 內執行的

知識點

當子程式完成後,在子程式內的各項變數或動作將會結束而不會傳回到父程式中

這句話是啥意思呢?煮個栗子

我們前面提到過的 showname.sh這個指令碼來說明好了,這個指令碼可以讓使用者自行設定兩個變數,分別是 firstname 與 lastname,想一想,如果你直接執行該指令時,該指令幫你設定的 firstname 會
不會生效?看一下底下的執行結果:

[
[email protected]
bin]$ echo ${firstname} ${lastname} <==確認了,這兩個變數並不存在喔! [[email protected] bin]$ sh showname.sh Please input your first name: Rivesr <==這個名字是自己輸入的 Please input your last name: Xue Your full name is: Rivers Xue <==看吧!在 script 運作中,這兩個變數有生效 [[email protected] bin]$ echo ${firstname} ${lastname} <==事實上,這兩個變數在父程式的 bash 中還是不存在的!

上面的結果你應該會覺得很奇怪,怎麼我已經利用 showname.sh設定好的變數竟然在 bash 環境底下無效!怎麼回事呢? 如果將程式相關性繪製成圖的話,我們以下圖來說明。當你使用直接執行的方法來處理時,系統會給予一支新的 bash 讓我們來執行 showname.sh裡面的指令,因此你的firstname, lastname 等變數其實是在下圖中的子程式 bash 內執行的。 當 showname.sh執行完畢後,子程式 bash 內的所有資料便被移除,因此上表的練習中,在父程式底下 echo ${firstname} 時, 就看不到任何東西了!這樣可以理解嗎?
showname.sh 在子程序當中執行的示意圖

利用 source 來執行指令碼:在父程式中執行

如果你使用 source 來執行指令那就不一樣了!同樣的指令碼我們來執行看看:

[[email protected] bin]$  source showname.sh
Please input your first name: Rivers
Please input your last name: Xue
Your full name is: Rivers Xue
[[email protected] bin]$  echo  ${firstname} ${lastname}
Rivers Xue <==嘿嘿!有資料產生喔!

竟然生效了!沒錯啊!因為 source 對 script 的執行方式可以使用底下的圖示來說明! showname.sh會在父程式中執行的,因此各項動作都會在原本的 bash 內生效!這也是為啥你不登出系統而要讓某些寫入 ~/.bashrc 的設定生效時,需要使用『 source ~/.bashrc 』而不能使用『 bash ~/.bashrc 』是一樣的啊!
showname.sh在父程序中執行的示意圖