trap — 捕捉信号
简介
查看信号
$ kill -l
查看当前信号绑定
$ stty -a
trap 处理信号
trap 在 bash 中是一个内置命令:
$ type trap trap is a shell builtin
用法如下 (man trap 中搜索 trap):
trap [-lp] [[arg] sigspec ...]
- -l
- 作用同 "kill -l" 列出所有信号
- -p
- 输出当前和各个信号绑定的“命令”
- arg
- 如果是空字符串,那么就执行捕捉到的后面列表中的信号的本来行为; 如果 arg 不知空字符串,当捕捉到后面信号列表中的信号时就执行此命令。
- sigspec
- 可以是多个 "trap -l" (或 "kill -l") 输出的信号列表中的信号名或信号数字值
$ trap hello EXIT # 绑定 EXIT 信号发生后的执行程序为 hello (trap 只管绑定,不管是否存在。 $ trap -p # 输出当前有那些绑定 trap -- 'hello' EXIT
trap捕捉到信号之后,可以有三种反应方式:
- 执行一段程序来处理这一信号
- 接受信号的默认操作
- 忽视这一信号
调用程序处理信号
trap commands signal-list
常见信号
| HUP(1) | 挂起,通常因终端掉线或用户退出而引发 |
| INT(2) | 中断,通常因按下Ctrl+C组合键而引发 |
| QUIT(3) | 退出,通常因按下Ctrl+\组合键而引发 |
| ABRT(6) | 中止,通常因某些严重的执行错误而引发 |
| ALRM(14) | 报警,通常用来处理超时 |
| TERM(15) | 终止,通常在系统关机时发送 |
set 和 shopt
set
set -o # 查看 set -o vi # 打开 vi 特性,同时也关闭了 emacs 特性 set +o vi # 关闭 vi 特性
shopt
# shopt -p # 查看 # shopt -p cdspell # 查看 cdspell 设置 # shopt -u cdspell # 关闭 # shopt -s cdspell # 打开 # cd /usr/loca # 现在可以用模糊路径名了 /usr/local # shopt -p cdspell shopt -s cdspell
shopt 可以设置的一些属性如下:
| cdable_vars | 如果给cd内置命令的参数不是一个目录,就假设它是一个变量名,变量的值是将要转换到的目录 |
| cdspell | 纠正cd命令中目录名的较小拼写错误。检查的错误包括颠倒顺序的字符,遗漏的字符以及重复的字符。如果知道一处修改,正确的路径就打印出,命令将继续。只用于交互式shell |
| checkhash | bash在试图执行一个命令前,先在哈希表中寻找,以确定命令是否存在。如果命令不存在,就执行正常路径搜索 |
| checkwinsize | bash在每个命令后检查窗口大小,如果有必要,就更新LINES和COLUMNS的值 |
| cmdhist | bash试图将一个多行命令的所有行保存在同一个历史项中。这使得多行命令的重新编辑更方便 |
| dotglob | bash在文件名扩展的结果中包括以点(.)开头的文件名 |
| execfail | 如果一个交互式shell不能执行指定给exec内置命令作为参数的文件,它不会退出。如果exec失败,一个交互式shell不会退出 |
| expand_aliases | 别名被扩展。默认为打开 |
| extglob | 打开扩展的模式匹配特征(正常的表达式元字符来自Korn shell的文件名扩展) |
| histappend | 当shell退出时,历史清单将添加到以HISTFILE变量的值命名的文件中,而不是覆盖文件 |
| histreedit | 如果readline正被使用,用户有机会重新编辑一个失败的历史替换 |
| histverify | 如果设置,且readline正被使用,历史替换的结果不会立即传递给shell解析器。而是将结果行装入readline编辑缓冲区中,允许进一步修改 |
| hostcomplete | 如果设置,且readine正被使用,当正在完成一个包含@的词时bash将试图执行主机名补全。默认为打开 |
| huponexit | 如果设置,当一个交互式登陆shell退出时,bash将发送一个SIGHUP(挂起信号)给所有的作业 |
| interactive_comments | 在一个交互式shell中,允许以#开头的词以及同一行中其他的字符被忽略。默认为打开 |
| lithist | 如果打开,且cmdhist选项也打开,多行命令将用嵌入的换行符保存到历史中,而无需在可能的地方用分号来分隔 |
| mailwarn | 如果设置,且bash用来检查邮件的文件自从上次检查后已经被访问,将显示消息“The mail in mailfile has been read” |
| nocaseglob | 如果设置,当执行文件名扩展时,bash在不区分大小写的方式下匹配文件名 |
| nullglob | 如果设置,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身 |
| promptvars | 如果设置,提示串在被扩展后再经历变量和参量扩展。默认为打开 |
| restricted_shell | 如果shell在受限模式下启动就设置这个选项。该值不能被改变。当执行启动文件时,不能复位该选项,允许启动文件发现shell是否是受限的 |
| sourcepath | 如果设置,source内置命令使用PATH的值来寻找包含作为参数提供的文件的目录。默认为打开 |
| source | 点(.)的同义词 |
| shift_verbose | 如果该选项设置,当移动计数超过位置参量个数时,shift内置命令将打印一个错误消息 |
