在 bash 中,可以使用 set
内置指令設定和檢視 shell 的屬性。
這些屬性會影響 shell 的不同行為。
下面對一些常用的屬性進行說明。
set 指令
檢視 help set 對
set
指令的說明如下: set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]Change the value of shell attributes and positional parameters, or display the names and values of shell variables.
Using + rather than - causes these flags to be turned off.
即,
set
指令後面可以跟着要設定的 shell 屬性選項。
如果選項以
-
開頭,則是設定為打開該選項。
+
開頭,則是設定為關閉該選項。
使用 set -e 選項在遇到報錯後停止執行
檢視 help set 指令,對
-e
選項說明如下:
-eExit immediately if a command exits with a non-zero status.
set -e
會在遇到任何非 0 的指令傳回值時,退出所在的 shell。
在腳本開頭
#!/bin/bash
語句的下一行添加
set -e
語句,那麼執行該腳本時,執行過程中遇到的任何錯誤都會終止腳本,可以避免執行後續的腳本語句。
具體舉例說明如下:
#!/bin/bash
set -e
從程式設計的角度來說,
set -e
選項的作用跟C語言的 assert() 函數類似,遇到錯誤就停止。
在調試 shell 腳本時,如果遇到某個不預期的錯誤,就可以使用這個選項讓腳本及時停止運作,以便找到最接近出錯位置的語句。
使用 set -x 選項打開調試開關
-x
-xPrint commands and their arguments as they are executed.
set -x
會列印具體執行的指令、以及指令的參數。
這些參數是經過 bash 擴充後的參數,可以友善看到的各個變量值擴充後的結果是什麼、某個變量是否擴充為空導緻參數個數發生變化,等等。
如前面說明,把選項開頭的
-
改成
+
會關閉選項,
set +x
指令關閉調試開關。
具體舉例如下:
$ set -x
$ ls test*
+ ls --color=auto testcase.sh testfile
$ set +x
這裡先執行
set -x
指令打開調試開關。
然後執行
ls test*
指令,可以看到擴充後的指令為
ls --color=auto testfile testcase.sh
。
從擴充後的結果可以看到
test*
被擴充為目前目錄下以 "test" 開頭的檔案名,有助于了解
*
通配符的擴充結果。
可以使用類似于下面的語句在 shell 腳本中設定該選項:
#!/bin/bash
set -x
在學習 bash 通配符、各個擴充表達式時,
set -x
可以列印出具體的擴充結果,便于了解。
使用 set -v 回顯所輸入的指令
-v
-vPrint shell input lines as they are read.
set -v
選項會回顯所輸入的指令。
跟
set -x
的差別在于,
set -x
顯示的是擴充後的結果,而
set -v
顯示的是所輸入的指令自身。
$ set -v
$ ls test*
ls test*
testcase.sh testfile
可以看到,設定
set -v
選項後,執行
ls test*
指令,回顯的内容就是 "ls test*"。