trap [argument n [n2]...]
onintr [-| label]
*trap [arg sig [sig2...]]
+trap [-p] [action condition...]
当 shell 接收数字或符号信号 (n) 时,会读取和执行 trap 命令 argument。(注意:设置陷阱和执行陷阱时,分别扫描一次 argument。)陷阱命令按照信号编号或对应符号名称的顺序执行。尝试对输入到当前 shell 时忽略的信号设置陷阱将不起作用。尝试对信号 11(内存故障)设置陷阱会生成错误。如果 argument 不存在,则会将所有陷阱 n 重置为其原始值。如果 argument 为空字符串,则 shell 及其调用的命令将忽略该信号。如果 n 为 0,将在退出 shell 时执行命令 argument。不带参数的 trap 命令输出与各信号编号关联的命令的列表。
onintr 控制 shell 在发生中断时的操作。未指定参数时,onintr 在中断时将恢复 shell 的缺省操作。(shell 会终止 shell 脚本并返回到终端命令输入级别)。指定了 − 参数时,shell 将忽略所有中断。指定了 label 参数时,当收到中断信号时或者当某个子进程因为被中断而终止时,shell 将执行 goto label。
trap 将 arg 用作要在 shell 接收信号 sig 时读取和执行的命令。设置陷阱和执行陷阱时,分别扫描一次 arg。可以将各个 sig 指定为信号编号或信号名称。trap 命令按照信号编号的顺序执行。尝试对输入到当前 shell 时忽略的信号设置陷阱将不起作用。如果 arg 已省略或为 −,则会将各个 sig 的陷阱重置为其原始值。如果 arg 为空(空字符串,例如 "")字符串,则 shell 及其调用的命令将忽略该信号。如果 sig 为 ERR,则只要命令的退出状态为非零值,就会执行 arg。如果 sig 为 DEBUG,则在每个命令之后执行 arg。对于在任何函数外部设置的 trap,如果 sig 为 0 或 EXIT,则会在退出 shell 时执行命令 arg。不带参数的 trap 命令输出与各信号编号关联的命令的列表。
在本手册页中,前面加有一个或两个 *(星号)的 ksh88(1) 命令将通过以下方式进行特殊处理:
命令完成时,该命令前面的变量赋值列表仍然有效。
在变量赋值之后处理 I/O 重定向。
脚本中包含的错误会导致其中止。
如果字的后面是前面加有**的命令且字为变量赋值的格式,则使用与变量赋值相同的规则扩展这些字。这表示在 = 符号之后执行波浪号替换,并且不执行字拆分和文件名生成。
trap 是一个特殊的内置函数,用于定义发生诸如接收信号之类的情况时要执行的操作。trap 也可以用于在标准输出中显示当前的陷阱设置。
如果 action 为 -,则 trap 会将每种情况重置为缺省值。如果 action 为空字符串,则 shell 会忽略每种情况(如果发生)。否则,发生相应的情况之一时,shell 将读取和执行参数 action,就像由 eval 处理一样。陷阱操作将覆盖与每种指定情况关联的以前的所有操作。执行陷阱不会更改 $? 的值。
condition 可以是信号名称或信号编号,也可以是以下几项之一:
shell 退出时执行该陷阱。如果在带有 function 保留字的函数中定义了该选项,函数返回时将在调用者的环境中执行陷阱。陷阱操作将恢复为调用函数时的值。
与 EXIT 相同。
在每个简单命令执行之前但在参数扩展之后执行。
每当 set -e 会导致 shell 退出时就会执行。
通过终端设备输入密钥时执行。
信号名称不区分大小写,sig 前缀是可选的。无法捕获或重置输入到非交互式 shell 时忽略的信号,但是这样做不会报告错误。使用除 1、2、3、6、9、14 和 15 之外的信号编号不可移植。
尽管 trap 是一个特殊内置命令,但是指定 shell 不了解的情况会导致 trap 以非零退出状态退出,但不会终止正在调用的 shell。
如果未指定操作或情况,则会将当前的所有陷阱设置写入标准输出。
ksh 中的 trap 内置命令支持以下选项:
导致当前陷阱以可作为用于重新创建当前陷阱的 shell 输入处理的格式输出。
ksh 中的陷阱内置命令将以下列值之一退出:
成功完成。
出现错误。
在本手册页中,前面有一个或两个 +(加号)的 ksh(1) 命令按以下方式特殊处理:
命令完成时,该命令前面的变量赋值列表仍然有效。
在变量赋值之后处理 I/O 重定向。
脚本中包含的错误会导致其中止。
它们不是有效的函数名称。
如果字的后面是前面加有 ++ 的命令且字为变量赋值的格式,则使用与变量赋值相同的规则扩展这些字。这表示在 = 符号之后执行波浪号替换,并且不执行字拆分和文件名生成。
有关下列属性的说明,请参见 attributes(5):
|