linux shell編程 trap命令


trap命令用於指定在接收到信號后將要采取的行 動,我們將在本書后面的內容中詳細介紹信號。trap命令的一種常見用途是在腳本程序被中斷時完成清理工作。歷史上,shell總是用數字來代表信號,而 新的腳本程序應該使用信號的名字,它們保存在用#include命令包含進來的signal.h頭文件中,在使用信號名時需要省略SIG前綴。你可以在命 令提示符下輸入命令trap -l來查看信號編號及其關聯的名稱。

對於那些不熟悉信號的人們來說,“信號”是指那些被異步發送到一個程序的事件。默認情況下,它們通常會終止一個程序的運行。

trap命令的參數分為兩部分,前一部分是接收到指定信號時將要采取的行動,后一部分是要處理的信號名

請記住,腳本程序通常是以從上到下的順序解釋執行的,所以必須在你想保護的那部分代碼以前指定trap命令。

如果要重置某個信號的處理條件到其默認值,只需簡單的將command設置為-。如果要忽略某個信號,就把command設置為空字符串‘’。一個不帶參數的trap命令將列出當前設置的信號及其行動的清單。

表2-11列出了X/Open規范里面規定的能夠被捕獲的比較重要的一些信號(括號里面的數字是傳統的信號編號)。更多細節請參考signal在線手冊的第七部分(man 7 signal)。

表 2-11

信     號

說     明

HUP(1)

掛起,通常因終端掉線或用戶退出而引發

INT(2)

中斷,通常因按下Ctrl+C組合鍵而引發

QUIT(3)

退出,通常因按下Ctrl+\組合鍵而引發

ABRT(6)

中止,通常因某些嚴重的執行錯誤而引發

ALRM(14)

報警,通常用來處理超時

TERM(15)

終止,通常在系統關機時發送

實驗:信號處理

下面的腳本演示了一些簡單的信號處理方法:

運行這個腳本,在每次循環時按下Ctrl+C組合鍵(或任何你系統上設定的中斷鍵),我們將得到如下所示的輸出:

實驗解析

在這個腳本程序中,我們先用trap命令安排它在出 現一個INT(中斷)信號時執行rm –f /tmp/my_tmp_file_$$命令刪除臨時文件。腳本程序然后進入一個while循環,只要臨時文件存在,循環就一直持續下去。當用戶按下 Ctrl+C組合鍵時,就會執行rm –f /tmp/my_tmp_file_$$語句,然后繼續下一個循環。因為臨時文件現在已經被刪除了,所以第一個while循環將正常退出。

接下來,腳本程序再次調用trap命令,這次是指定 當一個INT信號出現時不執行任何命令。腳本程序然后重新創建臨時文件並進入第二個while循環。這次當用戶按下Ctrl+C組合鍵時,沒有語句被指定 執行,所以采取默認處理方式,即立即終止腳本程序。因為腳本程序被立即終止了,所以永遠也不會執行最后的echo和exit語句。

16.unset命令

unset命令的作用是從環境中刪除變量或函數。這個命令不能刪除shell本身定義的只讀變量(如IFS)。這個命令並不常用。

下面的腳本第一次輸出字符串“Hello World”,但第二次只輸出一個換行符:

使用foo=語句產生的效果與上面腳本中的unset命令產生的效果


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com