手記06之shell如何執行指令碼

2021-05-22 16:37:18 字數 3516 閱讀 1662

1.

執行執行內建命令

$ 

[root@localhost desktop]# type -a ls

ls is aliased to `ls --color=tty'
ls is /bin/ls
[root@localhost desktop]# type -a type
type is a shell builtin

執行內建命令相當於呼叫

shell

程序中的乙個函式,並不建立新的程序。以前學過的cd、

alias

、umask

、exit

等命令即是內建命令,凡是用

which

命令查不到程式檔案所在位置的命令都是內建命令,內建命令沒有單獨的

man手冊,要在

man手冊中檢視內建命令,應該

$ man bash-builtins command(

如cd)

很多內建命令,如

export

、shift、if

、eval、[

、for

、while

等等。內建命令雖然不建立新的程序,但也會有

exit status

,通常也用

0表示成功非零表示失敗,雖然內建命令不建立新的程序,但執行結束後也會有乙個狀態碼,也可以用特殊變數

$?讀出。

首先編寫乙個簡單的指令碼,儲存為

script.sh

2.1簡單的

shell指令碼

#! /bin/sh
cd ..
ls
shell

指令碼中用

#表示注釋,相當於

c語言的

//注釋。但如果

#位於第一行開頭,並且是

#!(稱為

shebang

)則例外,它表示該指令碼使用後面指定的直譯器

/bin/sh

解釋執行。如果把這個指令碼檔案加上可執行許可權然後執行:

$ chmod u+x script.sh
$ ./script.sh
shell

會fork

乙個子程序並呼叫

exec

執行./script.sh

這個程式,

exec

系統呼叫應該把子程序的**段替換成

./script.sh

程式的**段,並從它的

_start

開始執行。然而

script.sh

是個文字檔案,根本沒有**段和

_start

函式,怎麼辦呢?其實

exec

還有另外一種機制,如果要執行的是乙個文字檔案,並且第一行用

shebang

指定了直譯器,則用直譯器程式的**段替換當前程序,並且從直譯器的

_start

開始執行,而這個文字檔案被當作命令列引數傳給直譯器。因此,執行上述指令碼相當於執行程式

$ /bin/sh ./script.sh
以這種方式執行不需要

script.sh

檔案具有可執行許可權。再舉個例子,比如某個

sed指令碼的檔名是

script

,它的開頭是

#! /bin/sed -f
執行./script

相當於執行程式

$ /bin/sed -f ./script.sh
以上介紹了兩種執行

shell

指令碼的方法:

$ ./script.sh
$ sh ./script.sh
這兩種方法本質上是一樣的,執行上述指令碼的步驟為:

2.2

shell指令碼的執行過程

1.互動

shell

(bash

)fork/exec

乙個子shell(sh

)用於執行指令碼,父程序

bash

等待子程序

sh終止。

2.sh

讀取指令碼中的

cd ..

命令,呼叫相應的函式執行內建命令,改變當前工作目錄為上一級目錄。

3.sh

讀取指令碼中的

ls命令,

fork/exec

這個程式,列出當前工作目錄下的檔案,

sh等待

ls終止。

4.ls

終止後,

sh繼續執行,讀到指令碼檔案末尾,

sh終止。

5.sh

終止後,

bash

繼續執行,列印提示符等待使用者輸入。

如果將命令列下輸入的命令用

()括號括起來,那麼也會

fork

出乙個子

shell

執行小括號中的命令,一行中可以輸入由分號

;隔開的多個命令,比如:

$ (cd ..;ls -l)
和上面兩種方法執行

shell

指令碼的效果是相同的,

cd ..

命令改變的是子

shell

的pwd

,而不會影響到互動式

shell

。然而命令

$ cd ..;ls -l
則有不同的效果,

cd ..

命令是直接在互動式

shell

下執行的,改變互動式

shell

的pwd

,然而這種方式相當於這樣執行

shell

指令碼:

$ source ./script.sh
或者

$ . ./script.sh
source或者.

命令是shell

的內建命令,這種方式也不會建立子

shell

,而是直接在互動式

shell

下逐行執行指令碼中的命令。

使用者在命令列輸入命令後,一般情況下

shell

forkexec該命令,但是

shell

的內建命令例外

(如何檢視該命令是否為內建命令呢?用

type命令(

手記05)

, type

命令本身也是內建命令

shell 執行指令碼

第一行,宣告直譯器 bin bash 符號能夠被核心識別成是乙個指令碼的開始,這一行必須位於指令碼的首行,bin bash是bash程式的絕對路徑,在這裡表示後續的內容將通過bash程式解釋執行。shell指令碼的執行 1 輸入指令碼的絕對路徑或相對路徑 root helloworld.sh hel...

shell 執行指令碼的幾種方式

最近在linux下使用shell的時候,碰到一些問題,最後將shell執行指令碼的方式總結如下 1 點號 指令碼的路徑 test.sh 當前使用者需要對 test.sh有執行許可權 即x許可權 指令碼執行環境在子shell中,子shell執行完指令碼後將結果返回。2 sh 空格 指令碼的路徑 或者 ...

Shell多執行緒執行指令碼示例

shell指令碼是順序執行的,但是系統允許多個shell指令碼同時執行,為了達到資源的綜合利用,也就是把伺服器往死裡用,有時候需要一段指令碼對多個指令碼進行多執行緒的排程,並且等待完成之後繼續執行後續的指令碼。主指令碼 bin bash 用於識別子執行緒的完成數量 rm test.count tou...