2010-02-01 46 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