2007年8月8日星期三

GNU/Linux 指令 trap

指令名稱:
trap(1) - 信號捕捉 (bash shell 內建指令)
語法:
trap [-lp] [arg] [sigspec ...]
說明:
這 個內建指令的名字取的相當有意思。trap 是"陷阱"的意思,她會捕捉我們所指定的信號(sigspec),當符合指定的信號產生,trap 就會執行使用者交付給她的指令(arg)。通常會使用到 trap 大多是為了debug script。我們可以就由她來了解 script 的執行細節或回報狀態。在交談模式下則幾乎沒有使用她的理由。

當指令的 arg 沒有指令或帶入了 - 符號時,所有信號將會被回復成初始值。當 arg 為空字串,則所有指定的信號將會被 shell 忽略執行帶入的指令。當指令使用 - p 選項同時沒有 arg 指定時,顯示 sigspec 信號的指令。

基本上 sigspec 允野H名稱或數字來代入。EXIT(0) 代表退出 shell 之後執行 arg 命令。DEBUG 代表每個簡單指令(Simple Commands[註1]) 後執行 arg 命令。DEBUG trap 不執行來自於 until 或 while 迴圈,或 if 的判斷式,或 && 及 || 邏輯判斷等執行失敗的命令,還有執行狀態值被反轉時也不予以執行。在交談模式下,使用選項 -l 可以顯示所有的信號名稱及相對應的數值資料。
實例說明:
顯示信號名稱與對應的數值
# trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 33) SIGRTMIN 34) SIGRTMIN+1
35) SIGRTMIN+2 36) SIGRTMIN+3 37) SIGRTMIN+4 38) SIGRTMIN+5
39) SIGRTMIN+6 40) SIGRTMIN+7 41) SIGRTMIN+8 42) SIGRTMIN+9
43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12 46) SIGRTMIN+13
47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-14 50) SIGRTMAX-13
51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 54) SIGRTMAX-9
55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6 58) SIGRTMAX-5
59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2 62) SIGRTMAX-1
63) SIGRTMAX
#

看起來只是一份簡單的表列...但卻可以讓我們寫的很累....實在讓我越看越感覺敬畏。幸虧羅素他老人家生的早,要不然,肯定活不到 49...

在 script 中的運用

請假設你面對一支數百行的 shell script,在空無一人的辨公室..深夜孤燈下的你在明明不該抽煙的電腦房裡,一口一口地吐出無奈的 X 字煙霧...快咪上眼睛的頭腦中...你告訴自己...豬八戒...豬八戒...怎麼...豬八戒(台語)

這時如果你能善用 trap 來觀察可疑點的執行狀態的話,或許有助於問題的解決。以下是個過度簡化的簡陋例子...實際的運用大概也和以下相去不遠...

# cat trap01
#!/bin/bash
trap 'echo Varible Listing -- aa = $aa , bb = $bb' EXIT
aa=10
bb=21
exit 0
#

第一行的 trap 指令,我設定捕捉 EXIT 信號,用 echo 來顯示當時的變數數值..然後請假設你在屬不清的問題迴圈中插入 exit 0,想知道當時的變數數值....或許善用的巧妙的話...收工就有望了。

以下是上例的執行結果

# trap01
Varible Listing -- aa = 10 , bb = 21
#

或許,永遠用不到這個指令的人是幸福的...這篇暫時簡單到此。

網路農夫 2004/01/16

備註: 這段當作功課好了,讓我偷懶一下....
*1 SHELL GRAMMAR -- Simple Commands
A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. The first word specifies the command to be executed, and is passed as argument zero. The remaining words are passed as arguments to the invoked command.

The return value of a simple command is its exit status, or 128+n if the command is terminated by signal n.

没有评论: