第二十三天:trap


在有些情况下,我们不希望自己的shell脚本在运行时刻被中断,比如说我们写得shell脚 
本设为某一用户的默认shell,使这一用户进入系统后只能作某一项工作,如数据库备份, 我 
们可不希望用户使用ctrl+C之类便进入到shell状态,做我们不希望做的事情。这便用到了信号 
处理。 
kill -l可以列出系统的信号名称
通常我们需要忽略的信号有四个,即:HUP, INT, QUIT, TSTP,也就是信号1, 2, 3, 24 
trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP 
用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回复默认值。
用stty -a可以列出中断信号与键盘的对应,分别执行上面的命令后,运行 
tail -f /etc/passwd, 然后尝试用键盘中断,试试两种情况(默认和忽略)下有何不同。 

 

常用系统变量:

$0           当前shell程序的名字

$1 ~ $9   命令行上的第一到第九个参数

$#           命令行上的参数个数

$*           命令行上的所有参数

$@         分别用双引号引用命令行上的所有参数

$$           当前进程的进程标识号(PID)

$?           上一条命令的退出状态

$!            最后一个后台进程的进程标识号

系统变量只能引用不能修改

trap命令用于指定在接收到信号后将要采取的行动,trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名.

信     号

说     明

HUP(1)

挂起,通常因终端掉线或用户退出而引发

INT(2)

中断,通常因按下Ctrl+C组合键而引发

QUIT(3)

退出,通常因按下Ctrl+\组合键而引发

ABRT(6)

中止,通常因某些严重的执行错误而引发

ALRM(14)

报警,通常用来处理超时

TERM(15)

终止,通常在系统关机时发送


一. trap捕捉到信号之后,可以有三种反应方式:

  1. 执行一段程序来处理这一信号
  2. 接受信号的默认操作
  3. 忽视这一信号

二. trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双
引号中的命令串:
trap 'commands' signal-list
trap "commands" signal-list

第二种形式的trap命令,为了恢复信号的默认操作:
trap signal-list

第三种形式的trap命令允许忽视信号:
trap " " signal-list

在第一种形式中,执行命令,对于双引号和单引号是有区别的。

#/bin/bash

#忽略信号
#trap " " 2

#双引号,shell第一次设置信号的时候就执行命令和变量的替换,时间不变 trap "echo `date`:can not terminate by ctrl+C" 2                

#单引号,要在shell探测到信号来的时候才执行命令和变量的替换,时间一直变 trap 'echo `date`:can not terminate by ctrl+C' 2                

while [ 1 ]
do
        echo -n "input a num : "
        read num 
        if [ $num -eq -1 ]
        then
                echo "bye"
                break
        fi
        echo "you have enter $num"
done

转载于:https://my.oschina.net/u/566829/blog/262449

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值