在Bash中识别接收到的信号名称

当收到一个信号,我可以使用trap执行一些命令。 例:

 trap 'echo hello world' 1 2 

如果收到任何指定的信号,则显示“hello world”。

但是,如何打印/识别接收到的信号名称?

(如果你只有一个信号的号码并且想要这个名字, kill -l $SIGNAL_NUM打印一个信号的名字;你可以通过使用信号名称而不是你的呼叫中的数字来trap ,如下所示。

这个答案表明,唯一的方法来确定你在bash中捕获的信号是为每个你想要陷阱的信号编写一个单独的包装。 在同一个问题上的另一个答案提供了一个包装函数为你做:

码:

 #!/bin/bash trap_with_arg() { func="$1" ; shift for sig ; do trap "$func $sig" "$sig" done } func_trap() { echo Trapped: $1 } trap_with_arg func_trap INT TERM EXIT read # Wait so the script doesn't exit. 

如果我运行,那么我可以发送信号到过程,我得到的输出像

 Trapped: INT Trapped: TERM Trapped: EXIT 

在陷阱内(通过信号触发),$? 变量最初设置为信号数加128,所以您可以通过将陷阱动作的第一个语句设置为类似于

 sig=$(($? - 128)) 

然后可以使用kill命令获取信号的名称

 kill -l $sig