Shell英文意思是外殼, 用戶可以通過Shell和操作系統交互,通俗的講Shell就是一個解釋器,當我們輸入命令Shell就解釋執行,Shell有很多版本,我們一般使用的都是bash,在Linux輸入一條命令可以查看當前正在使用的Shell:
echo $SHELL
屏幕會出現:
/bin/bash
Shell有兩種方式:
因此,我們主要來學習Shell腳本編程。
在理解Shell腳本運行的原理之前,我們必須得先搞清楚shell運行的原理:
當我們在Linux下輸入:
ls -al 或者 cd ..
到底發生了什麼?
在解釋原理之前,我們必須分清楚的是:我們在Linux輸入的命令是有區別的,具體來說,分爲內部命令(built-in)以及外部命令,向ls,cat,mkdir這些都屬於外部命令,而echo,cd,pwd這些都屬於內置命令,如何區分這些命令是否是內置,外部命令,可以利用type命令來辨別
輸入ls,cd這些內部或者外部的命令有什麼區別?具體而言:
像cd,pwd這些內置命令是屬於Shell的一部分,當Shell一運行起來就隨Shell加載入內存,因此,當我們在命令行上輸入這些命令就可以像調用函數一樣直接使用,效率非常高。
而如ls,cat這些外部命令卻不是如此,當我們在命令行輸入cat,當前的Shell會fork一個子進程,然後調用exec載入這個命令的可執行文件,比如bin/cat,因此效率上稍微低了點。
理解了單個命令的運行原理,我們現在探究當編寫一個Shell腳本運行的原理,首先需要的說明的是,Shell,和Python一樣,都是一門解釋性語言,所謂的解釋性語言就是不用編譯,執行一行解釋一行。
當我們編寫一個Shell腳本test.sh,比如:
#!/bin/bash
echo "hello"
ls -al
在Linux命令輸入./ test.sh時(需要加可執行權限)時,我們在這個文本文件開頭指定了bash爲默認的解釋器,因此當前的交互式Shell會fork一個子進程,用bash解釋器的代碼去替換(也就是exec),而這個文本文件被當作是命令行參數傳給這個子bash,等這個子bash執行完就會到我們的交互式bash了。
爲了驗證我們所說的交互式bash會fork/exec一個子bash來執行命令而非交互式bash,我們做個測試:
1.直接在交互式bash輸入:
cd ..
2.編寫腳本test.sh,然後運行:
//其中test.sh內容如下:
#!/bin/bash
cd ..
在Linux命令行輸入 ./test.sh
結果如下:
我們發現同樣都是cd ..,爲什麼執行完腳本當前bash目錄不變,這就證明了我們所說的是由子bash執行,而非交互式bash,那麼如何交互式bash執行腳本呢,我們可以使用. 或者source命令,如下圖: