set命令是shell中初學者比較少接觸,可是卻頗有用的一個命令(這裏咱們說的shell指的是bash)。set命令是shell解釋器的一個內置命令,用來設置shell解釋器的屬性,從而可以控制shell解釋器的一些行爲。html
➜ ~/programming/test $ type set set is a shell builtin
不帶選項執行set命令時,會輸出當前shell的全部變量,輸出格式就和shell腳本里面的變量賦值的格式同樣:name=value
。所以,set命令的輸出能夠直接做爲一個stdin的輸入。shell
set命令的基本語法以下(來自bash的man手冊):bash
set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...] set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]
set經過選項來開關shell的不一樣特性,每一個特性都對應一個選項。每一個特性都有兩種配置方式:ui
一種是經過set -e
和set +e
這種形式,即直接指定選項。code
另外一種是經過set -o errexit
和set +o errexit
這種形式,即經過o這個選項來指定選項名。htm
我想你必定對選項是用+號仍是-號十分好奇。在set命令中,選項前面跟着-號表示開啓這個選項,+表示關閉這個選項。ip
執行set -o
會輸出當前的set選項配置狀況:文檔
~/programming/test$ set -o allexport off braceexpand on emacs on errexit off errtrace off functrace off hashall on histexpand on history on ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off pipefail off posix off privileged off verbose off vi off xtrace off
執行set +o
也是輸出當前的set選項的配置狀況,只不過輸出形式是一系列的set命令。這種輸出形式通常用於重建當前的set配置項時使用。get
~/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 -o interactive-comments set +o keyword set -o monitor set +o noclobber set +o noexec set +o noglob set +o nolog set +o notify set +o nounset set +o onecmd set +o physical set +o pipefail set +o posix set +o privileged set +o verbose set +o vi set +o xtrace
設置了這個選項後,當一個命令執行失敗時,shell會當即退出。cmd
設置了這個選項後,shell讀取命令,可是不會執行它們。這個選項能夠用來檢查shell腳本是否存在語法錯誤。
設置了這個選項以後,當shell要擴展一個還未設置過值的變量時,shell必須輸出信息到stderr,而後當即退出。可是交互式shell不該該退出。
設置了這個選項以後,對於每一條要執行的命令,shell在擴展了命令以後(參數擴展)、執行命令以前,輸出trace到stderr。
這個選項會影響管道的返回值。默認狀況下,一個管道的返回值是最後一個命令的返回值,好比cmda | cmdb | cmdc
這個管道,返回值是由cmdc命令的返回值決定的。若是指定了pipefail選項,那麼管道的返回值就會由最後一個失敗的命令決定,意思就是有命令失敗就會返回非0值。若是全部命令都成功,則返回成功。
#!/bin/bash set -o xtrace set -o errexit # 能夠把這樣註釋掉看下執行效果有什麼不同。 echo "Before" ls filenoexists # ls也不存在的文件 echo "After"
本文介紹的只是set命令的經常使用部分,更多的選項能夠參考官方文檔或者bash的man手冊。官方文檔地址是:
http://pubs.opengroup.org/onlinepubs/009695399/utilities/set.html