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 ..
lsshell
指令碼中用
#表示注釋,相當於
c語言的
//注釋。但如果
#位於第一行開頭,並且是
#!(稱為
shebang
)則例外,它表示該指令碼使用後面指定的直譯器
/bin/sh
解釋執行。如果把這個指令碼檔案加上可執行許可權然後執行:
$ chmod u+x script.sh
$ ./script.shshell
會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.shsource或者.
命令是shell
的內建命令,這種方式也不會建立子
shell
,而是直接在互動式
shell
下逐行執行指令碼中的命令。
使用者在命令列輸入命令後,一般情況下
shell
會fork
並exec
該命令,但是
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...