bash 中的内置trap
语法如下
trap [-lp] [arg] [sigspec ...]
...每个
sigspec
都是信号名称或信号编号。信号名称不区分大小写,并且 SIG 前缀是可选的。...
bash 手册指出sigspec
可以是EXIT
, DEBUG
, RETURN
, 和ERR
。它们是信号的名称吗?
为什么我在下面给出的所有信号名称列表中找不到它们,甚至SIG
为它们添加了前缀?
它们只与 bash shell 有关,与 Linux 操作系统无关吗?它们是 bash shell 信号而不是 Linux 操作系统信号吗?
$ 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
谢谢。
答案1
这些名称在 bash 中具有特殊含义,其用法在手册:
如果 sigspec 为 0 或 EXIT,则 arg 将在 shell 退出时执行。如果 sigspec 是 DEBUG,则命令 arg 在每个简单命令、for 命令、case 命令、select 命令、每个算术 for 命令之前以及在 shell 函数中执行第一个命令之前执行...
如果 sigspec 为 ERR,则只要管道(可能由单个简单命令组成)、列表或复合命令返回非零退出状态,就会执行命令 arg,但需满足以下条件...
答案2
这些不是信号,但在某些其他情况下使用该机制也是有意义的trap
。这些名称仅在 bash 中有意义。