linux之shell-信号及trap信号捕捉

trap命令

trap ‘commands’ signal-list:当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令
trap signal-list:trap不指定任何命令,接受信号的默认操作.默认操作是结束进程的运行
trap - signal-list: 重置某个信号的处理为默认值,恢复信号
trap ’ ’ signal-list:trap命令指定一个空命令串,允许忽视信号.

注意:trap 对同种signal只能相应一种设定,如果在一个shell里面设置多个trap,如:
trap ’ echo “aaaaaaaaaaa” ’ INT
trap ’ echo “bbbbbbbbbbb” ’ INT

那么它只会响应最后一个信号设定。

实例1 捕捉到错误由命令中退出脚本

err_handler() {
    ret=$?
    [ "$ret" -eq 0 ] && return
    echo "ERROR: Running ${FUNCNAME[1]} failed!"
    echo "ERROR: exit code $ret from line ${BASH_LINENO[0]}:"
    echo " $BASH_COMMAND"

    exit $ret #这里退出shell
}

trap 'err_handler' ERR

set -eE #-E 设定之后 ERR 陷阱会被 shell 函数继承。

实例2 ctrl+C无法退出脚本

trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
echo "This is a test script"

count=1
while [ $count -le 10 ]
do
    echo "Loop #$count"
    sleep 1
    count=$[ $count + 1 ]
done

echo "This is the end of the test script"

在这里插入图片描述

signal信号

signal 是要捕捉的信号。

Linux 系统预定义的信号

trap -l /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
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

shell 内部自定义的信号(伪信号)

EXIT 从一个函数中退出或整个脚本执行完毕

ERR 当一条命令返回非零状态时(代表命令执行不成功)

DEBUG 脚本中每一条命令执行之前

Linux信号简介

  1. SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联.

  2. SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出

  3. SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-/)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号.

  4. SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号.

  5. SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用.

  6. SIGABRT 程序自己发现错误并调用abort时产生.

  7. SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.

  8. SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数.

  9. SIGFPE 在发生致命的算术运算错误时发出.不仅包括浮点运算错误, 还包括溢出及除数为0等所有的算术的错误.

  10. SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略.

  11. SIGUSR1 留给用户使用

  12. SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.

  13. SIGUSR2 留给用户使用

  14. SIGPIPE Broken pipe

  15. SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.

  16. SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.

  17. SIGCHLD 子进程结束时, 父进程会收到这个信号.

  18. SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符

  19. SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

  20. SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

  21. SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.

  22. SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.

  23. SIGURG 有紧急数据或out-of-band数据到达socket时产生.

  24. SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变

  25. SIGXFSZ 超过文件大小资源限制.

  26. SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.

  27. SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

  28. SIGWINCH 窗口大小改变时发出.

  29. SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.

  30. SIGPWR Power failure

Bash Shell 环境变量

变量 说明

$* 含有所有命令行参数(以单个文本值的形式)

$@ 含有所有命令行参数(以多个文本值的形式)

$# 命令行参数数目

$? 最近使用的前台进程的退出状态码

$- 当前命令行选项标记

$$ 当前shell的进程 ID (PID)

$! 最近执行的后台进程的 PID

$0 命令行中使用的命令名称

$_ shell 的绝对路径名

BASH 用来调用 shell 的完整文件名

BASHOPTS 允许冒号分隔列表形式的 Shell 选项

BASHPID 当前 bash shell 的进程 ID

BASH_ALIASED 含有当前所用别名的数组

BASH_ARGC 当前子函数中的参数数量

BASH_ARGV 含有所有指定命令行参数的数组

BASH_CMDS 含有命令的内部散列表的数组

BASH_COMMAND 当前正在被执行的命令名

BASH_ENV 如果设置了的话,每个 bash 脚本都会尝试在运行前执行由该变量定义的起始文件

BASH_EXECUTION_STRING 在 -c 命令行选项中用到的命令

BASH_LINENO 含有脚本中每个命令的行号的数组

BASH_REMATCH 含有与指定的正则表达式匹配的文本元素的数组

BASH_SOURCE 含有 shell 中已声明函数所在源文件名的数组

BASH_SUBSHELL 当前 shell 生成的子 shell 数目

BASH_VERS INFO 含有当前 bash shell 实例的主版本号和次版本号的数组

BASH_VERS ION 当前 bash shell 实例的版本号

BASH_XTRACEFD 当设置一个有效的文件描述符整数时,跟踪输出生成,并与诊断和错误信息分离开文件描述符必须设置 -x 启动

COLUMNS 含有当前 bash shell 实例使用的终端的宽度

COMP_CWORD 含有变量 COMP_WORDS 的索引直,COMP_WORDS 包含当前光标所在的位置

COMP_KEY 调用补全功能的按键

COMP_LINE 当前命令行

COMP_POINT 当前光标位置相对干当前命令起始位置的索引

COMP_TYPE 补全类型所对应的整数值

COMP_WORDBREAKS 在进行单词补全时闬作单词分隔符的一组字符

COMP_WORDS 含有当前命令行上所有单词的数组

COMPREPLY 含有由 shell 函数生成的可能补全码的数组

COPROC 含有若干匿名协程 I/O 的文件描述符的数组

DIRSTACK 含有目录栈当前内容的数组

EMACS 如果设置了该环境变量,则 shell 认为其使用的是 emacs shell 缓冲区,同时禁止行编辑功能

ENV 当 shell 以 POSIX 模式调用时,每个 bash 脚本在运行之前都会执行由该环境变量所定义的起始文件

EUID 当前用户的有效用户 ID(数字形式)

FCEDIT fc 命令使用的默认编辑器

FIGNORE 以冒号分隔的后缀名列表,在文件名补全时会被忽略

FUNCNAME 当前执行的 shell 函数的名称

FUNCNEST 嵌套函数的最髙层级

GLOBIGNORE 以冒号分隔的模式列表,定义了文件名展开时要忽略的文件名集合

GROUPS 含有当前用户属组的数组

histchars 控制历史记录展开的字符(最多可有3个)

HISTCMD 当前命令在历史记录中的编号

HISTCONTROL 控制哪些命令留在历史记录列表中

HISTFILE 保存 shell 历史记录列表的文件名(默认是 .bash_history)

HISTFILESIZE 保存在历史文件中的最大行数

HISTIGNORE 以冒号分隔的模式列表,用来决定哪些命令不存进历史文件

HISTSIZE 最多在历史文件中保存多少条命令

HISTIMEFORMAT 设置后,决定历史文件条目的时间戳的格式字符串

HOSTFILE 含有 shell 在补全主机名时读取的文件的名称

HOSTNAME 当前主机的名称

HOSTTYPE 当前运行 bash shell 的机器

IGNOREEOF shell 在退出前必须收到连续的 EOF 字符的数量。如果这个值不存在,默认是 1

INPUTRC readline 初始化文件名(默认是 .inputrc)

LANG shell 的语言环境分类

LC_ALL 定义一个语言环境分类,它会覆盖 LANG 变量

LC_COLLATE 设置对字符串值排序时用的对照表顺序

LC_CTYPE 决定在进行文件名扩展和模式匹配时,如何解释其中的字符

LC_MESSAGES 决定解释前置美元符($)的双引号字符串的语言环境设置

LC_NUMERIC 决定格式化数字时的所使用的语言环境设置

LINENO 脚本中当前执行代码的行号

LINES 定义了终端上可见的行数

MACHTYPE 用"cpu-公司-系统"格式定义的系统类型

MAILCHECK Shell 多久查看一次新邮件(以秒为单位,默认值是 60)

MAPFILE 含有 mapfile 命令所读入文本的数组,当没有给出变量名的时候,使用该环境变量

OLDPWD shell 之前的工作目录

OPTERR 设置为 1 时,bash shell 会显示 getopts 命令产生的错误

OSTYPE 定义了 shell 运行的操作系统

PIPESTATUS 含有前台进程退出状态码的数组

POSIXLY_CORRECT 如果设置了该环境变量,bash 会以 POSIX 模式启动

PPID bash shell 父进程的 PID

PROMPT_COMMAND 如果设置该环境变量,在显示命令行主提示符之前会执行这条命令

PS1 主命令行提示符字符串

PS2 次命令行提示符字符串

PS3 select 命令的提示符

PS4 如果使用了 bash 的 -x 选项,在命令行显示之前显示的提示符

PWD 当前工作目录

RANDOM 返回一个 0~32 767 的随机数,对其赋值可作为随机数生成器的种子

READLINE_LINE 保存了 readline 行缓冲区中的内容

READLINE_POINT 当前 readline 行缓冲区的插入点位置

REPLY read 命令的默认变量

SECONDS 自 shell 启动到现在的秒数,对其赋值将会重置计时器

SHELL shell 的全路径名

SHELLOPTS 已启用 bash shell 选项列表,由冒号分隔

SHLVL 表明 shell 层级,每次启动一个新的 bash shell 时计数加 1

TIMEFORMAT 指定了 shell 显示的时间值的格式

TMOUT select 和 read 命令在没输入的情况下等待多久(以秒为单位)。默认值为零,表示无限长

TMPDIR 如果设置成目录名,shell 会将其作为临时文件目录

UID 当前用户的真实用户 ID (数字形式)

set命令

set: set [–abefhkmnptuvxBCHP] [-o 选项名] [–] [参数 …]
设定或取消设定 shell 选项和位置参数的值。
改变 shell 选项和位置参数的值,或者显示 shell 变量的名称和值。
set - 选项打开
set + 选项关闭

选项:
-a 标记修改的或者创建的变量为导出。
-b 立即通告任务终结。
-e 如果一个命令以非零状态退出,则立即退出。
-f 禁用文件名生成(模式匹配)。
-h 当查询命令时记住它们的位置
-k 所有的赋值参数被放在命令的环境中,而不仅仅是命令名称之前的参数。
-m 启用任务控制。
-n 读取命令但不执行

-o 选项名
设定与选项名对应的变量:
allexport 与 -a 相同
braceexpand 与 -B 相同
emacs 使用 emacs 风格的行编辑界面
errexit 与 -e 相同
errtrace 与 -E 相同
functrace 与 -T 相同
hashall 与 -h 相同
histexpand 与 -H 相同
history 启用命令历史
ignoreeof shell 读取文件结束符时不会退出
interactive-comments允许在交互式命令中显示注释
keyword 与 -k 相同
monitor 与 -m 相同
noclobber 与 -C 相同
noexec 与 -n 相同
noglob 与 -f 相同
nolog 目前可接受但是被忽略
notify 与 -b 相同
nounset 与 -u 相同
onecmd 与 -t 相同
physical 与 -P 相同
pipefail 管道的返回值是最后一个非零返回值的命令的返回结果,或者当所有命令都返回零是也为零。
posix 改变默认时和 Posix 标准不同的 bash 行为以匹配标准
privileged 与 -p 相同
verbose 与 -v 相同
vi 使用 vi 风格的行编辑界面
xtrace 与 -x 相同

-p 无论何时当真实的有效的用户身份不匹配时打开。禁用对 $ENV 文件的处理以及导入 shell 函数。关闭此选项会导致有效的用户编号和组编号设定为真实的用户编号和组编号

-t 读取并执行一个命令之后退出。

-u 替换时将为设定的变量当作错误对待。

-v 读取 shell 输入行时将它们打印。

-x 执行命令时打印它们以及参数。

-B shell 将执行花括号扩展。

-C 设定之后禁止以重定向输出的方式覆盖常规文件。

-E 设定之后 ERR 陷阱会被 shell 函数继承。

-H 启用 ! 风格的历史替换。当 shell 是交互式的时候这个标识位默认打开。

-P 设定之后类似 cd 的会改变当前目录的命令不追踪符号链接。

-T 设定之后 DEBUG 陷阱会被 shell 函数继承。

– 任何剩余的参数会被赋值给位置参数。如果没有剩余的参数,位置参数不会被设置。

- 任何剩余的参数会被赋值给位置参数。

-x 和 -v 选项已关闭。

使用 + 而不是 - 会使标志位被关闭。标志位也可以在shell 被启动时使用。当前的标志位设定可以在 $- 变量中找到。剩余的 ARG 参数是位置参数并且是按照$1, $2, … $n 的顺序被赋值的。如果没有给定 ARG参数,则打印所有的 shell 变量。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值