指定在接收到信號(hào)后將要采取的動(dòng)作
trap命令 用于指定在接收到信號(hào)后將要采取的動(dòng)作,常見的用途是在腳本程序被中斷時(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í)行。
trap -[lp] [[arg] sigspec ...]
如果arg參數(shù)缺省或者為“-”,每個(gè)接收到的sigspec信號(hào)都將會(huì)被重置為它們進(jìn)入shell時(shí)的值;
如果arg是空字符串每一個(gè)由sigspec指定的信號(hào)都會(huì)被shell和它所調(diào)用的命令忽略;
如果有-p選項(xiàng)而沒有提供arg參數(shù)則會(huì)打印所有與sigspec指定信號(hào)相關(guān)聯(lián)的的trap命令;
如果沒有提供任何參數(shù)或者僅有-p選項(xiàng),trap命令將會(huì)打印與每一個(gè)信號(hào)有關(guān)聯(lián)的命令的列表;
-l選項(xiàng)的作用是讓shell打印一個(gè)命令名稱和其相對應(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í)行:
簡單命令,for語句,case語句,select命令,算法命令,在函數(shù)內(nèi)的第一條命令。
更多trap debug的使用可以參考extdebug選項(xiàng)說明。
如果sigspec是ERR,arg參數(shù)指定的命令將會(huì)在任何簡單命名執(zhí)行完后返回值為非零值時(shí)執(zhí)行,但是也有以下例外情況:
如果執(zhí)行失敗的命令是緊跟在while或者until關(guān)鍵字之后的一組命令中的一部分時(shí)如果執(zhí)行失敗的命令是if測試語句的一部分時(shí)linux命令大全,是 && 和 ||連接的列表中的一部分時(shí)如果執(zhí)行失敗的命令的返回值是被取反過的(通過!操作符)
在以上情況中如果sigspec是ERR,arg命令不會(huì)執(zhí)行,這些規(guī)則同樣適用于errexit選項(xiàng)。如果sigspec是RETURN,arg指定的命令在每次shell函數(shù)或者腳本用”.”或者內(nèi)置的命令執(zhí)行完成后執(zhí)行,在shell入口處被忽略的命令 是沒法被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(失。駝t返回成功(true)。
不論該進(jìn)程是捕獲了該信號(hào)并從其信號(hào)處理函數(shù)返回,還是簡單地忽略該信號(hào),寫操作都將返回epipe錯(cuò)誤。系統(tǒng)在設(shè)計(jì)系統(tǒng)調(diào)用時(shí)就考慮了中斷處理問題.當(dāng)進(jìn)程運(yùn)行到一個(gè)系統(tǒng)調(diào)用時(shí)發(fā)生了中斷,則進(jìn)程進(jìn)入該中斷處理,處理完成后,進(jìn)程會(huì)跳過該系統(tǒng)調(diào)用而進(jìn)入下一條程序指令. 應(yīng)該注意的是中斷發(fā)生在系統(tǒng)調(diào)用一級(jí)而不是子程序或函數(shù)一級(jí).比如一個(gè)程序在一個(gè)子程序被調(diào)用前設(shè)置了超時(shí)中斷,并在子程序中收到超時(shí)中斷,系統(tǒng)在處理完超時(shí)中斷后接著處理該子程序被中斷的系統(tǒng)調(diào)用之后的指令,而不是從調(diào)用該子程序名指令的后一條指令繼續(xù)處理.。在用戶進(jìn)程需要對某個(gè)中斷做自己定義的處理時(shí),可以自己定義中斷處理函數(shù),并設(shè)置中斷處理函數(shù)與該中斷相關(guān)聯(lián).這樣,用戶進(jìn)程在收到該中斷后,即調(diào)用用戶定義的函數(shù),處理完成后用戶進(jìn)程從被中斷處繼續(xù)運(yùn)行(若用戶定義的中斷函數(shù)沒有長跳函數(shù)或退出運(yùn)行等會(huì)改變運(yùn)行指令地址的系統(tǒng)調(diào)用).在中斷信號(hào)被處理后,該中斷的處理函數(shù)會(huì)恢復(fù)成上次缺省處理函數(shù)而不是保持用戶定義函數(shù),故在用戶定義的中斷處理函數(shù)中一般都再定義該中斷和函數(shù)自己的關(guān)聯(lián).。