通式 $ trap "command" signo 其中signo是 cyril@grill:~$ kill -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 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 例如 $ trap "" 2 $ trap "rm $TMPFILE" EXIT 1 2 15如果""的command則表示shell不處理這個signal, 2號就是INT通常就是按了Ctrl-C打斷shell script的執行,15就是 TERM(process被kill了),再看難一點的例子
trap_init() { trap ' scriptcleanup [ "$SCRIPT_DISP" = ABORT ] && exit 100 [ "$SCRIPT_DISP" = PASSED ]; exit $?' EXIT if [ -z "$__TC_INTERACTIVE" ] then for sig in HUP INT TERM; do trap " trap - HUP INT TERM; echo 'Signaled - cleanup after script ...' >&2; scriptcleanup $sig; kill -$sig $$; exit 101" $sig done fi trap : PIPE }這個例子的前面如果抓到EXIT這個signal就執行scriptclean到exit $?的code, 就是單quote內的東西, 如果$__TC_INTERACTIVE不是空字串,就執行下面的signal處理, 最後如果是SIGPIPE(13號)就不做任何事(冒號:)