shell指令碼執行的原理(source命令等)

2021-08-03 03:57:19 字數 1947 閱讀 7409

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,我們做個測試:

cd ..
//其中test.sh內容如下:

#!/bin/bash

cd ..

在linux命令列輸入 ./test.sh

結果如下:

我們發現同樣都是cd ..,為什麼執行完指令碼當前bash目錄不變,這就證明了我們所說的是由子bash執行,而非互動式bash,那麼如何互動式bash執行指令碼呢,我們可以使用. 或者source命令,如下圖:

shell 執行shell指令碼

bin bash echo hello world 是乙個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種 shell。echo 命令用於向視窗輸出文字。1 作為可執行程式 chmod x test.sh 使指令碼具有執行許可權 test.sh 執行指令碼注意,一定要寫成 test...

shell 指令碼的執行

如何執行shell程式,如何在shell程式以及後續指令碼中使用同乙個變數,這些在工作中經常用到,我找到如下的文章,再加深複習一下。1.source命令用法 source filename 作用 在當前bash環境下讀取並執行filename中的命令。該filename檔案可以無 執行許可權 注 該...

shell指令碼的執行

shell指令碼有兩種執行方式,一種是直接執行,一種是使用 source或.命令執行 直接執行shell指令碼,bash會在當前bash下新建乙個子bash程序用來執行shell指令碼,此時指令碼裡定義的變數,並不會傳會到父bash程序中 bin bash var 12 echo var exec....