使用set命令可以設置各種shell選項或者列出shell變量.單個選項設置常用的特性. 在某些選項之后-o參數(shù)將特殊特性打開.在某些選項之后使用+o參數(shù)將關閉某些特性, 不帶任何參數(shù)的set命令將顯示shell的全部變量.除非遇到非法的選項,否則set總是返回ture.
成都創(chuàng)新互聯(lián)公司作為成都網(wǎng)站建設公司,專注網(wǎng)站建設、網(wǎng)站設計,有關成都定制網(wǎng)頁設計方案、改版、費用等問題,行業(yè)涉及橡塑保溫等多個領域,已為上千家企業(yè)服務,得到了客戶的尊重與認可。
當BASH shell被調用時,可以列出全部的選項.當前的選項集列在$-中.在option參數(shù)被處理后,其他的參數(shù)被賦值到位置參數(shù)中(,,...,$n)
格式
set [--abefhkmnptuvxldCHP] [-o option name] [arguments ...]
詳解:
選項 說明
-a 自動向已經(jīng)修改的變量或為導出后序命令的變量作出標志
-b 不是在原提示符之前,而是立即引發(fā)終止后臺任務的狀態(tài)表
-e 如果命令帶非零值返回,立即退出 -
f 禁止帶擴展名的路徑
-h 定義函數(shù)時,定位和存儲函數(shù)命令,當函數(shù)被執(zhí)行時,通常查詢 函數(shù)命令
-k 所有的關鍵詞參數(shù),而不只是那些命令名前的關鍵詞參數(shù),被放 在環(huán)境命令中
-m 監(jiān)視器模式,啟動任務控制.此選項默認支持系統(tǒng)shell交互.后 臺進程以單獨的進程組運行,在每次完成任務時顯示包含退出的 狀態(tài)行
-n 讀取命令但不執(zhí)行命令.通常監(jiān)查shell腳本的句法錯誤.交互 shell被忽略
-o option-name 選項名可以是下列之一:
選項 說明
allexport 同-a選項
braceexpand shell執(zhí)行花括號擴展,在默認情況下起作用
emacs 使用emacs風格命令行編輯接口.除非shell以-noline-editing 選項啟動,否則當shell交互時,通過默認啟動該選項
errexit 同-e選項
histexpand 同-H選項
ignoreeof 其結果是好像shell命令IGNOREEOF=10被執(zhí)行
interactive 允許單詞前帶#號,以使得在交互shell中忽略命令行的全部字符
-commands
monitor 同-m選項
noclobber 同-C選項
noexec 同-n選項
noglob 同-f選項
nohash 同-d選項
notify 同-b選項
nounset 同-u選項
physical 同-p選項
posix 改變BASH屬性以匹配標準,默認操作不同于POSIX1003.2標準
verbose 同-v選項
vi 使用vi風格的命令行編輯器
XTRACE 同-x選項,如果沒有給出選項名,顯示當前選項值
-p 打開特權模式(在此模式,$ENV文件被處理,不能從環(huán)境中繼承 shell函數(shù).如果是有效用戶ID而不是實用戶組則自動啟動.關閉 此選項將使得有效用戶和組IDs設置實用戶和組IDs)
-t 在讀取命令并執(zhí)行之后退出
-u 當執(zhí)行參數(shù)括展時,把非設置變量作為錯誤處理(如果擴展企圖 出現(xiàn)在非設置變量中,shell顯示錯誤信息.如果不是交互式,則 帶非凌值退出)
-v 輸入行被讀取時,顯示shell輸入行
-x 在每個簡單命令被擴展之后,顯示PS4擴展值,之后是要執(zhí)行的命令
-l 保存和恢復綁定在命令中的名稱
-d 禁止執(zhí)行查找散列命令(通常,命令被保存在散列表中,一旦被找到 就不再繼續(xù)查找)
-C 效果好像是執(zhí)行了noclobber=shell命令
-H 使用!風格的歷史替代(當shell交互時,在默認情況下,此選項有效)
-P 如果設置此參數(shù),當執(zhí)行改變目錄命令cd時,不遵循符號鏈接,而是 使用實際的目錄
-- 如果在選項后沒有參數(shù),不設置位置參數(shù).否則,即使一些參數(shù)以a 選項開始,也要把位置參數(shù)設置為argument
- 結束選項的信號,將引發(fā)其余的參數(shù)被賦值到位置參數(shù)中(-x和-v 選項被關閉.如果沒有argument,位置參數(shù)將保留未改變的參數(shù))
Linux里面set -e命令作用是,如果一個命令返回一個非0退出狀態(tài)值(失敗),就退出.
這個命令-e參數(shù)企業(yè)應用極少
set的“+” ,"-" 分別用于關閉或者打開某些特性;具體的特性有很多,這里介紹 -e 特性:
set -e ; 表示后續(xù)所有的bash 命令的返回code 如果不是0,那么腳本立即退出,后續(xù)的腳本將不會得到執(zhí)行的機會;
set +e ; 這個是默認的狀態(tài),表示就算后續(xù)的命令如果返回值不是0,那么腳本依然向下執(zhí)行;
所以 set -e其實就是從設置的位置起,給腳本的每一條命令加上了同一個退出條件;而set +e 則是取消這種設置;
看下面的例子:
[root@oldboy ~]# cat test.sh
#!/bin/bash
function lookupstr(){
grep "sles" /etc/os-release /dev/null 21
if [ "$?" -ne 0 ];then
echo -e "Can not find the 'sles' string in file.\n"
fi
}
echo "Below results based on: set +e"
set +e
lookupstr
echo "Below results based on: set -e"
set -e
lookupstr
[root@oldboy ~]# ./test.sh
Below results based on: set +e
Can not find the 'sles' string in file.
Below results based on: set -e
[root@oldboy ~]#
set -e option 可以幫助優(yōu)化腳本
Linux系統(tǒng)設置:set命令詳解
set命令作?主要是顯?系統(tǒng)中已經(jīng)存在的shell變量,以及設置shell變量的新變量值。使?set更改shell特性時,符號"+"和"-"的作?分別是打開和關閉指定的模式。set命令不能夠定義新的shell變量。如果要定義新的變量,可以使?命令以變量名=值的格式進?定義即可。
語法
set(選項)(參數(shù))
選項
-a:標?已修改的變量,以供輸出?環(huán)境變量。
-b:使被中?的后臺程序?刻回報執(zhí)?狀態(tài)。
-C:轉向所產?的?件?法覆蓋已存在的?件。
-d:Shell預設會?雜湊表記憶使?過的指令,以加速指令的執(zhí)?。使?-d參數(shù)可取消。
-e:若指令傳回值不等于0,則?即退出shell。
-f:取消使?通配符。
-h:?動記錄函數(shù)的所在位置。
-H Shell:可利?"!"加指令編號的?式來執(zhí)?history中記錄的指令。
-k:指令所給的參數(shù)都會被視為此指令的環(huán)境變量。
-l:記錄for循環(huán)的變量名稱。
-m:使?監(jiān)視模式。
-n:只讀取指令,?不實際執(zhí)?。
-p:啟動優(yōu)先順序模式。
-P:啟動-P參數(shù)后,執(zhí)?指令時,會以實際的?件或?錄來取代符號連接。
-t:執(zhí)?完隨后的指令,即退出shell。
-u:當執(zhí)?時使?到未定義過的變量,則顯?錯誤信息。
-v:顯?shell所讀取的輸?值。
-x:執(zhí)?指令后,會先顯?該指令及所下的參數(shù)。
參數(shù)
取消某個set曾啟動的參數(shù)。
實例
使?declare命令定義?個新的環(huán)境變量"mylove",并且將其值設置為"Visual C++",輸?如下命令:
declare mylove='Visual C++' #定義新環(huán)境變量
再使?set命令將新定義的變量輸出為環(huán)境變量,輸?如下命令:
set -a mylove #設置為環(huán)境變量
執(zhí)?該命令后,將會新添加對應的環(huán)境變量。?戶可以使?命令和命令分別顯?和搜索環(huán)境變量"mylove",輸?命令如下:
env | grep mylove #顯?環(huán)境變量值
此時,該命令執(zhí)?后,將輸出查詢到的環(huán)境變量值。
¥
5.9
百度文庫VIP限時優(yōu)惠現(xiàn)在開通,立享6億+VIP內容
立即獲取
Linux系統(tǒng)設置:set命令詳解
Linux系統(tǒng)設置:set命令詳解
set命令作?主要是顯?系統(tǒng)中已經(jīng)存在的shell變量,以及設置shell變量的新變量值。使?set更改shell特性時,符號"+"和"-"的作?分別是打開和關閉指定的模式。set命令不能夠定義新的shell變量。如果要定義新的變量,可以使?命令以變量名=值的格式進?定義即可。
語法
set(選項)(參數(shù))
選項
-a:標?已修改的變量,以供輸出?環(huán)境變量。
第 1 頁
-b:使被中?的后臺程序?刻回報執(zhí)?狀態(tài)。
-C:轉向所產?的?件?法覆蓋已存在的?件。
-d:Shell預設會?雜湊表記憶使?過的指令,以加速指令的執(zhí)?。使?-d參數(shù)可取消。
-e:若指令傳回值不等于0,則?即退出shell。
-f:取消使?通配符。
-h:?動記錄函數(shù)的所在位置。
-H Shell:可利?"!"加指令編號的?式來執(zhí)?history中記錄的指令。
第 2 頁
-k:指令所給的參數(shù)都會被視為此指令的環(huán)境變量。
-l:記錄for循環(huán)的變量名稱。
-m:使?監(jiān)視模式。
-n:只讀取指令,?不實際執(zhí)?。
-p:啟動優(yōu)先順序模式。
-P:啟動-P參數(shù)后,執(zhí)?指令時,會以實際的?件或?錄來取代符號連接。
-t:執(zhí)?完隨后的指令,即退出shell。
-u:當執(zhí)?時使?到未定義過的變量,則顯?錯誤信息。
第 3 頁
-v:顯?shell所讀取的輸?值。
-x:執(zhí)?指令后,會先顯?該指令及所下的參數(shù)。
參數(shù)
取消某個set曾啟動的參數(shù)。
實例
使?declare命令定義?個新的環(huán)境變量"mylove",并且將其值設置為"Visual C++",輸?如下命令:
declare mylove='Visual C++' #定義新環(huán)境變量
第 4 頁
再使?set命令將新定義的變量輸出為環(huán)境變量,輸?如下命令:
set -a mylove #設置為環(huán)境變量
執(zhí)?該命令后,將會新添加對應的環(huán)境變量。?戶可以使?命令和命令分別顯?和搜索環(huán)境變量"mylove",輸?命令如下:
env | grep mylove #顯?環(huán)境變量值
此時,該命令執(zhí)?后,將輸出查詢到的環(huán)境變量值。
上周剛經(jīng)歷了一個“刪庫跑路”的慘重事件,不知哪位無邪的童鞋把Confluence 的數(shù)據(jù)存儲目錄 /var 清空了,結果群眾的怒火燃燒上了天空
這次結合自己的一些思考來記錄一些有關腳本安全的點
先來看一個簡單的案例
在用戶主目錄下創(chuàng)建safe目錄及相關文件用于測試演示
假如寫一段腳本刪除safe目錄下所有文件:
這段是不是看起來沒有問題,但如果由于有些大心臟的同學粗心,寫成下面這樣
最終,腳本都變成了rm? ?-rf? ? *? ?,可怕至極
其實在shell腳本當中,為了防止這種現(xiàn)象,我們可以借助set 命令來實現(xiàn)相關控制
關于set 命令有較多參數(shù),這里介紹最常用的幾個
我們以剛才圖4那段有問題的腳本說事
為保證不錯刪東西 ,我們加一個set -u 選項 ,判斷變量是否存在
我們執(zhí)行一下,看看效果
看,報錯啦,dir這個變量沒有聲明,ls 查看一下文件,發(fā)現(xiàn)都還存在
set -e? 與set -u 通常搭配在一起使用
一個是遇到錯誤退出,一個是發(fā)現(xiàn)空變量報錯
這兩個搭配在一起放在腳本里可以防止一些變量為空導致文件全被清空的問題
拓展一下:
如果只想應用在腳本的某一段中,那么
開始段落前加set -e 表示范圍開始
結束段落后加 set +e 表示范圍結束
set -x 與set + x同理。
1、刪文件其實不用rm -rf ,不是受迫性需要,不要使用rm -rf?
2、修改、刪除系統(tǒng)文件或其他重要的東西,先備份一份
3、非特殊需要,不建議在root下操作,普通用戶即可
4、腳本加上set -e 與set -u保證安全