trap简介
trap的格式如下,功能就是捕捉信号,并对信号进行处理
trap [-lp] [[arg] sigspec ...]
arg
可以是shell命令或者自定义函数sigspec
可以是以下的一个或多个- 定义在<
signal.h
>中的信号名或者数值。信号名的大小写不敏感,SIG这个前缀也是可选的。以下的命令的效果都是一样的
trap "echo SIGINT" SIGINT
trap "echo SIGINT" sigint
trap "echo SIGINT" 2
trap "echo SIGINT" int
trap "echo SIGINT" Int
调试脚本时,trap经常用到的信号量
- EXIT:在
shell
退出前执行trap
设置的命令,也可以指定为0 - RETURN:在
.
和``source执行其他脚本返回时,执行
trap`设置的命令 - DEBUG:在任何命令执行前执行trap设置的命令,但对于函数仅在函数的第一条命令前执行一次
- ERR:在命令结果为非0时,执行trap设置的命令
#! /bin/bash
# 使用trap实现在每个函数开始之前打印以便打印,这样就能准确的定位到函数的位置
# 从而实现对脚本的调试
trap "echo before a func is called" DEBUG
# 当. 或者 source 调用结束的时候出发
trap "echo . or source is called " RETURN
func()
{
echo "不管你信不信,这是一个函数"
exit 0
}
# 测试
echo "call ."
. traptest
# 函数的调用
func
# DEBUG 查看调试信号是否有效的设置了
# trap -p RETURN
# trap -p DEBUG
exit 0
执行结果
andrew@andrew-Thurley:/work/linux-sys/bash/2.基本/src$ bash trap_func.sh
before a func iis called
before a func iis called
call .
before a func iis called
. or source is called
before a func iis called
不管你信不信,这是一个函数
trap -l
:列出所有信号的数值和名字,类似于kill -l
andrew@andrew-Thurley:~$ trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
trap -p
:列出通过trap设置过的信号处理命令
andrew@andrew-Thurley:~$ trap -p
trap -- 'name ' SIGINT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
trap -- 'name ' RETURN
trap "" sigspec :忽略sigspec指定的信号
trap "do something" sigspec:收到sigspec指定的信号时,do some thing后,继续执行后续命令。
trap sigspec or trap - sigspec:恢复sigspec指定的信号的默认行为
注意
- 在函数中设置的
trap
也是全局生效的
#!/bin/bash
# trap设置在函数中的tap也是全局有效的
foo()
{
trap "echo func is called" DEBUG
}
# 输出 func is called
foo
# 调试触发
#trap -p DEBUG
# 输出trap -- 'echo func is called' SIGINT
exit 0
- 对于同一个信号,只有最后一次trap生效
- trap只在本进程内有效,它的子进程不会继承trap的设置。
使用trap设计一个用于反应程序执行过程的脚本
#!/bin/bash
# 使用trap来捕捉变量值.
# EXIT代表在函数退出前,执行trap
trap 'echo Variable Listing --- ret=${ret}' EXIT
ps -A
if [ $? == 0 ];then
echo "commond exec OK!"
ret=0
else
ret=1
fi
echo "注意这里,还没有调用trap"
# trap是在退出的时候清理程序时调用的
exit 0
关注,没有广告,还能要资料