2010-02-01 39 views
21

可能重複:
Identifying received signal name in bash shell script是否可以在bash中檢測*哪個*陷阱信號?

當使用像trap func_trap INT TERM EXIT有:

func_trap() { 
    ...some commands... 
} 

是否有功能塊的方式來檢測陷阱已經打電話給它?

喜歡的東西:

func_trap() { 
    if signal = INT; then 
     # do this 
    else 
     # do that 
    fi 
} 

或者我需要編寫,做一些不同的東西每個陷阱類型都有一個單獨的功能? 是否有一個bash變量保存最近接收到的信號?

在此先感謝!

回答

5

沒有任何參數或變量持有被困信號的文檔提示,所以您必須爲每個想要以不同方式行事的陷阱編寫函數/陷阱語句。

+0

謝謝。這可以節省我進一步挖掘。 – Wolf 2010-02-01 17:02:49

63

您可以實現自己的捕獲功能,可自動將信號傳遞給函數:

trap_with_arg() { 
    func="$1" ; shift 
    for sig ; do 
     trap "$func $sig" "$sig" 
    done 
} 

$ trap_with_arg func_trap INT TERM EXIT 

的第一個參數func_trap將是信號的名稱。

+4

+9000:您在Bash中使用[currying](http://en.wikipedia.org/wiki/Currying)。輝煌。 – kevinarpe 2013-11-09 10:26:19

+2

可能會更清楚地寫出:'for sig「$ @」;做' – kevinarpe 2013-11-09 10:33:38

+1

@kevinarpe:這將不得不在'$ @「中輸入sig;做' - 可能更清楚,但'var;對我來說「是一種常見的習慣用法,它就是一樣清楚。它也避免了使用'$ @'或'$ *'而不是''$ @''陷入許多人陷入的陷阱。 – camh 2013-11-09 22:21:46