如何在shell脚本中陷阱1个信号?
题
我想尝试诱捕信号1但失败
#!/bin/bash
# capture an interrupt # 0
trap 'echo "Exit 0 signal detected..."' 0
trap 'echo "Exit 1 signal detected..."' SIGHUP
# display something
echo "This is a checkpoint 1"
exit 1
echo "This is checkpoint 2"
# exit shell script with 0 signal
exit 0
Output--
kithokit@15:02:55 trunk (master) $ ./test.sh
This is a checkpoint 1
Exit 0 signal detected...
kithokit@15:03:44 trunk (master) $
.
即使是退出1,它始终陷入陷阱0,任何一个人都知道如何解决这个问题?
感谢
解决方案
exit 1
不发送稍微升级。它退出返回代码(AKA退出状态)1.要发送SIGHUP使用kill
:
#!/bin/bash
# capture an interrupt # 0
trap 'echo "Signal 0 detected..."' 0
trap 'echo "SIGHUP detected..."' SIGHUP
# display something
echo "This is a checkpoint 1"
kill -1 $$
echo "This is checkpoint 2"
# exit shell script with 0 signal
exit 0
.
$$
是当前过程的ID。因此,kill -1 $$
将信号1(sighup)发送到当前过程。上述脚本的输出为:
This is a checkpoint 1
SIGHUP detected...
This is checkpoint 2
Signal 0 detected...
.
如何检查退出返回码
如果目标是检查返回码(也称为退出状态)而不是捕获特殊信号,那么我们需要做的就是检查退出时的状态变量生成$?
:
#!/bin/bash
# capture an interrupt # 0
trap 'echo "EXIT detected with exit status $?"' EXIT
echo "This is checkpoint 1"
# exit shell script with 0 signal
exit "$1"
echo "This is checkpoint 2"
.
在命令行运行时,这会产生:
$ status_catcher 5
This is checkpoint 1
EXIT detected with exit status 5
$ status_catcher 208
This is checkpoint 1
EXIT detected with exit status 208
.
请注意,trap语句可以调用bash函数,该函数可以包括不同复杂的语句来处理不同的返回代码。
不隶属于 StackOverflow