2010-02-01 14 views
21

Olası Çoğalt:
Identifying received signal name in bash shell scriptBash'ta * hangi * trap sinyalini tespit etmek mümkün mü?

ile trap func_trap INT TERM EXIT gibi bir şey kullanırken:

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

hangi tuzak algılamak için fonksiyon bloğunda bir yolu var mı onu aradı?

şey gibi:

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

Veya farklı bir şey yapar her tuzak türü için ayrı işlevi yazmak gerekiyor? En son alınan sinyali tutan bir bash değişken var mı?

Şimdiden teşekkürler!

cevap

5

Yakalanan sinyali tutan herhangi bir argüman veya değişkenle ilgili hiçbir belge ipucu yok, bu nedenle farklı davranmak istediğiniz her tuzak için bir işlev/trap ifadesi yazmanız gerekir.

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

$ trap_with_arg func_trap INT TERM EXIT 

func_trap ilk argüman sinyalinin adı olacaktır:

+0

Teşekkürler. Bu beni daha da fazla kazarken kurtarır. – Wolf

63

otomatik işleve sinyalini iletir kendi tuzak işlevi uygulayabilir.

+4

+9000: Bash’te [currying] (http://en.wikipedia.org/wiki/Currying) kullanıyorsunuz. Parlak. – kevinarpe

+2

Yazmak için daha net olabilir: "sig için" $ @ "; – kevinarpe

+1

kevinarpe: "$ @" içinde sig için "olmalı"; Muhtemelen daha açık, ama 'için var; Benim için yeterince açık bir deyim (benim için), bu kadar açık. Ayrıca, birçok kişinin içine girdiği '$ @' yerine '$ @' veya '$ *' kullanmanın tuzağını da önler. – camh

İlgili konular