trap命令用于捕獲指定的信號(hào)并執(zhí)行預(yù)定義的命令。
其基本的語(yǔ)法是:
trap 'command' signal
其中signal是要捕獲的信號(hào),command是捕獲到指定的信號(hào)之后,所要執(zhí)行的命令。可以用kill –l命令看到系統(tǒng)中全部可用的信號(hào)名,捕獲信號(hào)后所執(zhí)行的命令可以是任何一條或多條合法的shell語(yǔ)句,也可以是一個(gè)函數(shù)名。
shell腳本在執(zhí)行時(shí),會(huì)產(chǎn)生三個(gè)所謂的“偽信號(hào)”,(之所以稱(chēng)之為“偽信號(hào)”是因?yàn)檫@三個(gè)信號(hào)是由shell產(chǎn)生的,而其它的信號(hào)是由操作系統(tǒng)產(chǎn)生的),通過(guò)使用trap命令捕獲這三個(gè)“偽信號(hào)”并輸出相關(guān)信息對(duì)調(diào)試非常有幫助。
信號(hào)名 | 何時(shí)產(chǎn)生 |
---|---|
EXIT | 從一個(gè)函數(shù)中退出或整個(gè)腳本執(zhí)行完畢 |
ERR | 當(dāng)一條命令返回非零狀態(tài)時(shí)(代表命令執(zhí)行不成功) |
DEBUG | 腳本中每一條命令執(zhí)行之前 |
通過(guò)捕獲EXIT信號(hào),我們可以在shell腳本中止執(zhí)行或從函數(shù)中退出時(shí),輸出某些想要跟蹤的變量的值,并由此來(lái)判斷腳本的執(zhí)行狀態(tài)以及出錯(cuò)原因,其使用方法是:
trap 'command' EXIT 或 trap 'command' 0
通過(guò)捕獲ERR信號(hào),我們可以方便的追蹤執(zhí)行不成功的命令或函數(shù),并輸出相關(guān)的調(diào)試信息,以下是一個(gè)捕獲ERR信號(hào)的示例程序,其中的$LINENO是一個(gè)shell的內(nèi)置變量,代表shell腳本的當(dāng)前行號(hào)。
$ cat -n exp1.sh |
其輸出結(jié)果如下:
$ sh exp1.sh |
在調(diào)試過(guò)程中,為了跟蹤某些變量的值,我們常常需要在shell腳本的許多地方插入相同的echo語(yǔ)句來(lái)打印相關(guān)變量的值,這種做法顯得煩瑣而笨拙。而通過(guò)捕獲DEBUG信號(hào),我們只需要一條trap語(yǔ)句就可以完成對(duì)相關(guān)變量的全程跟蹤。
以下是一個(gè)通過(guò)捕獲DEBUG信號(hào)來(lái)跟蹤變量的示例程序:
$ cat –n exp2.sh |
其輸出結(jié)果如下:
$ sh exp2.sh |
從運(yùn)行結(jié)果中可以清晰的看到每執(zhí)行一條命令之后,相關(guān)變量的值的變化。同時(shí),從運(yùn)行結(jié)果中打印出來(lái)的行號(hào)來(lái)分析,可以看到整個(gè)腳本的執(zhí)行軌跡,能夠判斷出哪些條件分支執(zhí)行了,哪些條件分支沒(méi)有執(zhí)行。