【发布时间】:2015-06-05 08:16:22
【问题描述】:
我想捕获信号SIGTSTP,就这么简单:
trap "" SIGTSTP
但是,纯 shell (sh) 不支持信号名称,因此陷阱必须使用信号编号,如下所示:
trap "" 20
问题:信号数取决于操作系统,因此 Linux 中的 SIGTSTP 为 20,但在 AIX 中为 18。
所以为了使其通用,我决定从trap -l 的结果中提取信号编号。原始输入是:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE
9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG
17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD
21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU
25) SIGXFSZ 27) SIGMSG 28) SIGWINCH 29) SIGPWR
30) SIGUSR1 31) SIGUSR2 32) SIGPROF 33) SIGDANGER
34) SIGVTALRM 35) SIGMIGRATE 36) SIGPRE 37) SIGVIRT
38) SIGALRM1 39) SIGWAITING 50) SIGRTMIN 51) SIGRTMIN+1
52) SIGRTMIN+2 53) SIGRTMIN+3 54) SIGRTMAX-3 55) SIGRTMAX-2
56) SIGRTMAX-1 57) SIGRTMAX 60) SIGKAP 61) SIGRETRACT
62) SIGSOUND 63) SIGSAK
我不能使用grep,因为我需要的功能--only-matching 并不总是得到支持。 trap -l | grep -oE "[0-9]+\) SIGTSTP" | cut -d')' -f1 运行良好,但仅适用于 Linux。
由于here描述的贪心问题,我也未能使用sed
所以trap -l | sed -nr 's/.*([0-9]+)\) SIGTSTP.*/\1/p' 只返回8,而不是18
我想让提取尽可能通用,所以我不会假设SIGTSTP 是一个两位数的代码,即使实际上它是。
有什么建议吗?
【问题讨论】:
-
POSIX 陷阱支持 0、EXIT 和信号符号名称(不带“SIG”);见pubs.opengroup.org/onlinepubs/009695399/utilities/trap.html
标签: linux shell sed signals aix