linux trap命令詳解
linux系統(tǒng)中trap命令常見(jiàn)的用途是在腳本程序被中斷時(shí)完成清理工作。那么下面由學(xué)習(xí)啦小編為大家整理了linux trap命令的相關(guān)知識(shí),希望對(duì)大家有幫助!
1.linux trap命令用法說(shuō)明
trap命令用于指定在接收到信號(hào)后將要采取的動(dòng)作,常見(jiàn)的用途是在腳本程序被中斷時(shí)完成清理工作。當(dāng)shell接收到sigspec指定的信號(hào)時(shí),arg參數(shù)(命令)將會(huì)被讀取,并被執(zhí)行。例如:
trap "exit 1" HUP INT PIPE QUIT TERM
表示當(dāng)shell收到HUP INT PIPE QUIT TERM這幾個(gè)命令時(shí),當(dāng)前執(zhí)行的程序會(huì)讀取參數(shù)“exit 1”,并將它作為命令執(zhí)行。
2.linux trap命令語(yǔ)法
trap [-lp] [[arg] sigspec ...]
3.linux trap命令選項(xiàng)參數(shù)說(shuō)明
如果arg參數(shù)缺省或者為“-”,每個(gè)接收到的sigspec信號(hào)都將會(huì)被重置為它們進(jìn)入shell時(shí)的值;
如果arg是空字符串每一個(gè)由sigspec指定的信號(hào)都會(huì)被shell和它所調(diào)用的命令忽略;
如果有-p選項(xiàng)而沒(méi)有提供arg參數(shù)則會(huì)打印所有與sigspec指定信號(hào)相關(guān)聯(lián)的的trap命令;
如果沒(méi)有提供任何參數(shù)或者僅有-p選項(xiàng),trap命令將會(huì)打印與每一個(gè)信號(hào)有關(guān)聯(lián)的命令的列表;
-l選項(xiàng)的作用是讓shell打印一個(gè)命令名稱和其相對(duì)應(yīng)的編號(hào)的列表。
每個(gè)sigspec信號(hào)都是是以名字或者編號(hào)的形式定義在signal.h頭文件中,信號(hào)的名字是不區(qū)分大小寫的,其前綴SIG是可選的,如果某個(gè)信號(hào)是 EXIT(0),那么arg指定的命令將會(huì)在shell上執(zhí)行退出命令時(shí)執(zhí)行(If a sigspec is EXIT (0) the command arg is executed on exit from the shell),如果sigspec是DEBUG,那么arg指定的命令將會(huì)在以下每個(gè)命令執(zhí)行之前執(zhí)行:
簡(jiǎn)單命令,for語(yǔ)句,case語(yǔ)句,select命令,算法命令,在函數(shù)內(nèi)的第一條命令。
更多trap debug的使用可以參考extdebug選項(xiàng)說(shuō)明。
如果sigspec是ERR,arg參數(shù)指定的命令將會(huì)在任何簡(jiǎn)單命名執(zhí)行完后返回值為非零值時(shí)執(zhí)行,但是也有以下例外情況:
1.如果執(zhí)行失敗的命令是緊跟在while或者until關(guān)鍵字之后的一組命令中的一部分時(shí)
2.如果執(zhí)行失敗的命令是if測(cè)試語(yǔ)句的一部分時(shí),是 && 和 ||連接的列表中的一部分時(shí)
3.如果執(zhí)行失敗的命令的返回值是被取反過(guò)的(通過(guò)!操作符)
在以上情況中如果sigspec是ERR,arg命令不會(huì)執(zhí)行,這些規(guī)則同樣適用于errexit選項(xiàng)。如果sigspec是RETURN,arg指定的命令在每次shell函數(shù)或者腳本用"."或者內(nèi)置的命令執(zhí)行完成后執(zhí)行,在shell入口處被忽略的命令 是沒(méi)法被trap和reset的,被trap的信號(hào),在創(chuàng)建的子進(jìn)程中使用時(shí)會(huì)在子進(jìn)程被創(chuàng)建時(shí)被重置為原始的值。如果trap使用的sigspec信號(hào) 是invalid的信號(hào)則trap命令返回false(失敗),否則返回成功(true)。
擴(kuò)展資料:信號(hào)
信號(hào)是一種進(jìn)程間通信機(jī)制,它給應(yīng)用程序提供一種異步的軟件中斷,使應(yīng)用程序有機(jī)會(huì)接受其他程序活終端發(fā)送的命令(即信號(hào))。應(yīng)用程序收到信號(hào)后,有三種處理方式:忽略,默認(rèn),或捕捉。進(jìn)程收到一個(gè)信號(hào)后,會(huì)檢查對(duì)該信號(hào)的處理機(jī)制。如果是SIG_IGN,就忽略該信號(hào);如果是SIG_DFT,則會(huì)采用系統(tǒng)默認(rèn)的處理動(dòng)作,通常是終止進(jìn)程或忽略該信號(hào);如果給該信號(hào)指定了一個(gè)處理函數(shù)(捕捉),則會(huì)中斷當(dāng)前進(jìn)程正在執(zhí)行的任務(wù),轉(zhuǎn)而去執(zhí)行該信號(hào)的處理函數(shù),返回后再繼續(xù)執(zhí)行被中斷的任務(wù)。
在有些情況下,我們不希望自己的shell腳本在運(yùn)行時(shí)刻被中斷,比如說(shuō)我們寫得shell腳本設(shè)為某一用戶的默認(rèn)shell,使這一用戶進(jìn)入系統(tǒng)后只能作某一項(xiàng)工作,如數(shù)據(jù)庫(kù)備份, 我們可不希望用戶使用Ctrl c之類便進(jìn)入到shell狀態(tài),做我們不希望做的事情。這便用到了信號(hào)處理。
linux trap命令詳解
下一篇:linux tree命令詳解