基本語法:
set命令的基本語法如下(來自bash的man手冊):
set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]
set通過選項來開關shell的不同特性,每個特性都對應一個選項。每個特性都有兩種配置方式:
一種是通過set -e和set +e這種形式,即直接指定選項。
另一種是通過set -o errexit和set +o errexit這種形式,即通過o這個選項來指定選項名。
我想你一定對選項是用+號還是-號十分好奇。在set命令中,選項前面跟着 - 表示開啟這個選項,+ 表示關閉這個選項。
選項介紹
-o
執行set -o會輸出當前的set選項配置情況:
例如:
~/programming/test$ set -o
allexport off
braceexpand on
emacs on
errexit off
errtrace off
functrace off
hashall on
histexpand on
+o
執行set +o也是輸出當前的set選項的配置情況,只不過輸出形式是一系列的set命令。這種輸出形式一般用於重建當前的set配置項時使用。
例如:
~/programming/test$ set +o
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
set +o functrace
set -o hashall
set -o histexpand
set -o history
set +o ignoreeof
set -e 或者 set -o errexit
設置了這個選項后,當一個命令執行失敗時,shell會立即退出。
set -n 或者 set -o noexec
設置了這個選項后,shell讀取命令,但是不會執行它們。這個選項可以用來檢查shell腳本是否存在語法錯誤。
set -u 或者 set -o unset
設置了這個選項之后,當shell要擴展一個還未設置過值的變量時,shell必須輸出信息到stderr,然后立即退出。但是交互式shell不應該退出。
set -x 或者 set -o xtrace
設置了這個選項之后,對於每一條要執行的命令,shell在擴展了命令之后(參數擴展)、執行命令之前,輸出trace到stderr。
stdout, stdin, stderr的中文名字分別是標准輸出,標准輸入和標准錯誤。
set -o pipefail
這個選項會影響管道的返回值。默認情況下,一個管道的返回值是最后一個命令的返回值,
比如cmda | cmdb | cmdc這個管道,返回值是由cmdc命令的返回值決定的。如果指定了pipefail選項,那么管道的返回值就會由最后一個失敗的命令決定,
意思就是有命令失敗就會返回非0值。如果所有命令都成功,則返回成功。
例子
#!/bin/bash
set -o xtrace #即開啟簡易的腳本命令調試模式
set -o errexit # 可以把這樣注釋掉看下執行效果有什么不一樣。
echo "Before"
ls /filenoexists # ls也不存在的文件;執行報錯就退出了腳本,因此echo "After"就並未執行
echo "After"
詳細參考
man bash中的SHELL BUILTIN COMMANDS