shell的set命令

set命令簡介

set命令是shell中初學者比較少接觸,可是卻頗有用的一個命令(這裏咱們說的shell指的是bash)。set命令是shell解釋器的一個內置命令,用來設置shell解釋器的屬性,從而可以控制shell解釋器的一些行爲。html

➜ ~/programming/test  $ type set
set is a shell builtin

使用set命令

不帶選項執行set命令

不帶選項執行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 -eset +e這種形式,即直接指定選項。code

  • 另外一種是經過set -o errexitset +o errexit這種形式,即經過o這個選項來指定選項名。htm

我想你必定對選項是用+號仍是-號十分好奇。在set命令中,選項前面跟着-號表示開啓這個選項,+表示關閉這個選項。ip

選項介紹

-o

執行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

+o

執行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

-e or -o errexit

設置了這個選項後,當一個命令執行失敗時,shell會當即退出。cmd

-n or -o noexec

設置了這個選項後,shell讀取命令,可是不會執行它們。這個選項能夠用來檢查shell腳本是否存在語法錯誤。

-u or -o unset

設置了這個選項以後,當shell要擴展一個還未設置過值的變量時,shell必須輸出信息到stderr,而後當即退出。可是交互式shell不該該退出。

-x or -o xtrace

設置了這個選項以後,對於每一條要執行的命令,shell在擴展了命令以後(參數擴展)、執行命令以前,輸出trace到stderr。

-o pipefail

這個選項會影響管道的返回值。默認狀況下,一個管道的返回值是最後一個命令的返回值,好比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

相關文章
相關標籤/搜索