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 可以顯示所有的信號名稱及相對應的數值資料。
當指令的 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 |
看起來只是一份簡單的表列...但卻可以讓我們寫的很累....實在讓我越看越感覺敬畏。幸虧羅素他老人家生的早,要不然,肯定活不到 49...
在 script 中的運用
請假設你面對一支數百行的 shell script,在空無一人的辨公室..深夜孤燈下的你在明明不該抽煙的電腦房裡,一口一口地吐出無奈的 X 字煙霧...快咪上眼睛的頭腦中...你告訴自己...豬八戒...豬八戒...怎麼...豬八戒(台語)
這時如果你能善用 trap 來觀察可疑點的執行狀態的話,或許有助於問題的解決。以下是個過度簡化的簡陋例子...實際的運用大概也和以下相去不遠...
# cat trap01 |
第一行的 trap 指令,我設定捕捉 EXIT 信號,用 echo 來顯示當時的變數數值..然後請假設你在屬不清的問題迴圈中插入 exit 0,想知道當時的變數數值....或許善用的巧妙的話...收工就有望了。
以下是上例的執行結果
# trap01 |
或許,永遠用不到這個指令的人是幸福的...這篇暫時簡單到此。
網路農夫 2004/01/16
没有评论:
发表评论