是EXIT,DEBUG,RETURN和ERR信号吗?


14

trap在bash内置的语法如下

trap [-lp] [arg] [sigspec ...]

...每个sigspec都是信号名称或信号编号。信号名称不区分大小写,并且SIG前缀是可选的。

...

bash的说明书指出,sigspec可能是EXITDEBUGRETURN,和ERR。它们是信号的名称吗?

为什么在下面给出的所有信号名称列表中都找不到它们,甚至SIG为它们添加前缀?

它们仅与bash shell相关,而与Linux OS相关吗?它们是bash shell信号,而不是Linux OS信号吗?

$ 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    

谢谢。

Answers:


19

这些名称在bash中具有特殊含义,其用法在手册中进行说明:

如果sigspec为0或EXIT,则在退出外壳程序时执行arg。如果sigspec是DEBUG,则在每个简单命令,命令,case命令,选择命令,命令的每个算术之前以及在shell函数中执行第一个命令之前,都要执行命令arg ...

如果sigspec是ERR,则在以下情况下,只要管道(可能由单个简单命令组成),列表或复合命令返回非零退出状态,就会执行命令arg。


14

这些不是信号,但trap在某些其他情况下也可以使用该机制。这些名称仅在bash中具有含义。


1
EXIT陷阱的方法是POSIX规定虽然。
库沙兰丹

@Kusalananda我并不是说其他​​shell不支持此功能。
Hauke Laging,

3
@HaukeLaging从技术上(和在学方面上)讲这会使句子“这些名称bash 具有含义”不正确。
法拉普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.