在 Linux bash shell 中,可以使用 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 選項說明如下:
-e
Exit 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 選項打開調試開關
查看 help set 命令,對 -x 選項說明如下:
-x
Print 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 回顯所輸入的命令
查看 help set 命令,對 -v 選項說明如下:
-v
Print 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*"。
而不是回顯 test* 擴展之後、以 "test" 開頭的文件名。
閱讀更多 霜魚片 的文章