shell腳本運行的原理(source命令等)

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命令,如下圖:

這裏寫圖片描述

這裏寫圖片描述

發佈了96 篇原創文章 · 獲贊 119 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章