當shell指令碼執行時,它會先查詢系統環境變數env,該變數指定了環境檔案(載入順序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),在載入了上述環境變數檔案後,shell就開始執行shell指令碼中的內容。
shell指令碼是從上至下、從左至右依次執行每一行的命令及語句的,即執行完了乙個命令後再執行下乙個,如果在shell指令碼中遇到子指令碼(即指令碼巢狀)時,就會先執行子指令碼的內容,完成後再返回父指令碼繼續執行父指令碼內後續的命令及語句。
通常情況下,在執行shell指令碼時,會向系統核心請求啟動乙個新的程序,以便在該程序中執行指令碼的命令及子shell指令碼,基本流程如圖:
shell指令碼的執行通常可以採用以下幾種方式:
1)bash script-name或sh script-name
這是當指令碼檔案本身沒有可執行許可權(即檔案許可權屬性x位為-號)時常使用的方法,或者指令碼檔案開頭沒有指定直譯器時需要使用的方法;
舉例說明:
[root@localhost ~]# vim test.sh
echo 'this is a shell scripts!'
[root@localhost ~]# sh test.sh
this is a shell scripts!
[root@localhost ~]# bash test.sh
this is a shell scripts!
2)path/script-name或./script-name
指在當前路徑下執行指令碼(指令碼需要有執行許可權),需要將指令碼檔案的許可權先改為可執行(即檔案許可權屬性加x位),具體方法為chmod+x script-name。然後通過指令碼絕對路徑或相對路徑就可以直接執行指令碼了;
舉例說明:
[root@localhost ~]# ./test.sh
-bash: ./test.sh: 許可權不夠
[root@localhost ~]# chmod u+x test.sh
[root@localhost ~]# ./test.sh
this is a shell scripts!
這種方法比較麻煩一些!每次編寫完指令碼都必須給指令碼乙個執行的許可權,否則將會提示「許可權不夠」的錯誤。
3)source script-name或.script-name
這種方法通常是使用source或「.」(點號)讀入或載入指定的shell指令碼檔案(如san.sh),然後,依次執行指定的shell指令碼檔案san.sh中的所有語句。這些語句將在當前父shell指令碼father.sh程序中執行(其他幾種模式都會啟動新的程序執行子指令碼)。因此,使用source或「.」可以將san.sh自身指令碼中的變數值或函式等的返回值傳遞到當前父shell指令碼father.sh中使用。
舉例說明:
[root@localhost ~]# chmod u-x test.sh
[root@localhost ~]# ll test.sh
-rw-r--r--. 1 root root 32 8月 26 03:09 test.sh
[root@localhost ~]# . test.sh
this is a shell scripts!
[root@localhost ~]# source test.sh
this is a shell scripts!
4)sh同樣適用於bash,不過這種用法不是很常見,但有時也可以有出奇制勝的效果,例如:不用迴圈語句來實現精簡開機自啟動服務的案例,就是通過將所有字串拼接為命令的形式,然後經由管道交給bash操作;
舉例說明:
[root@localhost ~]# ll test.sh
-rw-r--r--. 1 root root 32 8月 26 03:09 test.sh
[root@localhost ~]# sh乙個簡單的例子明白第三種執行方式的特殊性:
[root@localhost ~]# echo 'user=`whoami`' > test2.sh
[root@localhost ~]# cat test2.sh
user=`whoami`
[root@localhost ~]# sh test2.sh
[root@localhost ~]# echo $user
[root@localhost ~]# . test2.sh
[root@localhost ~]# echo $user
root
本人親自嘗試得出的結論有三點:
1.子shell指令碼會直接繼承父shell指令碼的變數、函式(就好像是兒子隨父親姓,基因也會繼承父親的)等,反之則不可以;2.如果希望反過來繼承(就好像是讓父親隨兒子姓,讓父親的基因也繼承兒子的),就要用source或「.」在父shell指令碼中事先載入子shell指令碼;
3.通過source或「.」載入執行過的指令碼,由於是在當前shell中執行指令碼,因此在指令碼結束之後,指令碼中的變數(包括函式)值在當前shell中依然存在,而sh和bash執行指令碼都會啟動新的子shell執行,執行完後退回到父shell。因此,變數(包括函式)值等無法保留。在進行shell指令碼開發時,如果指令碼中有引用或執行其他指令碼的內容或配置檔案的需求時,最好用「.」或source先載入該指令碼或配置檔案,處理完之後,再將它們載入到指令碼的下面,就可以呼叫source載入的指令碼及配置檔案中的變數及函式等內容了。
Shell指令碼的執行方式詳解 Authority
當shell指令碼執行時,它會先查詢系統環境變數env,該變數指定了環境檔案 載入順序通常是 etc profile bash profile bashrc etc bashrc等 在載入了上述環境變數檔案後,shell就開始執行shell指令碼中的內容。shell指令碼是從上至下 從左至右依次執行...
shell指令碼執行方式
echo輸出命令 echo 選項 輸出內容 選項 e 支援反斜線控制的字元轉換 shell指令碼 指令碼都以.sh結束,指令碼第一行 bin bash 以hello.sh簡單指令碼為例 指令碼執行有兩種方法 這裡出現了no such file or directory 原因是格式不匹配,解決方案 d...
shell 指令碼的執行方式
執行shell指令碼的方式基本上有三種 1 輸入定向到shell指令碼 這種方式是用輸入重定向方式讓shell從給定檔案中讀入命令列並進行相應處理。其一般形式是 bash 指令碼名 例如 bash 2 以指令碼名作為引數 其一般形式是 bash 指令碼名 引數 例如 bash ex2 usr men...