当收到信号时,我可以使用trap
执行一些命令.例子:
trap 'echo hello world' 1 2
如果接收到任何指定的信号,将显示"hello world".
但是如何打印/识别接收到的信号名称?
当收到信号时,我可以使用trap
执行一些命令.例子:
trap 'echo hello world' 1 2
如果接收到任何指定的信号,将显示"hello world".
但是如何打印/识别接收到的信号名称?
(如果您只有一个信号的号码,并且想要一个名称,那么kill -l $SIGNAL_NUM
会打印一个信号的名称;您可以在拨打trap
的电话中使用信号名称而不是数字来避免这种情况,如下所示.)
This answer表示无法访问信号名,但如果您对捕获的每个信号都有单独的函数,则您已经知道信号名:
trap 'echo trapped the HUP signal' HUP
trap 'echo different trap for the INT signal' INT
在许多情况下,这可能就足够了,但another answer on that same question利用这一事实提供了一个变通方法,来伪造你想要的行为.它接受一个函数和一个信号列表,并为使用信号名调用的函数上的每个信号设置一个单独的trap ,因此在内部,它实际上是每个信号的一个单独函数,但它看起来像是单个函数上的一个trap ,将信号名作为参数:
代码:
#!/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
echo "Send signals to PID $$ and type [enter] when done."
read # Wait so the script doesn't exit.
如果我运行它,那么我可以向进程发送信号,然后得到如下输出
Trapped: INT
Trapped: TERM
Trapped: EXIT