本设为某一用户的默认shell,使这一用户进入系统后只能作某一项工作,如数据库备份, 我
们可不希望用户使用ctrl+C之类便进入到shell状态,做我们不希望做的事情。这便用到了信号
处理。
用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回复默认值。
tail -f /etc/passwd, 然后尝试用键盘中断,试试两种情况(默认和忽略)下有何不同。
常用系统变量:
$0 当前shell程序的名字
$1 ~ $9 命令行上的第一到第九个参数
$# 命令行上的参数个数
$* 命令行上的所有参数
$@ 分别用双引号引用命令行上的所有参数
$$ 当前进程的进程标识号(PID)
$? 上一条命令的退出状态
$! 最后一个后台进程的进程标识号
系统变量只能引用不能修改! 信 号 | 说 明 |
HUP(1) | 挂起,通常因终端掉线或用户退出而引发 |
INT(2) | 中断,通常因按下Ctrl+C组合键而引发 |
QUIT(3) | 退出,通常因按下Ctrl+\组合键而引发 |
ABRT(6) | 中止,通常因某些严重的执行错误而引发 |
ALRM(14) | 报警,通常用来处理超时 |
TERM(15) | 终止,通常在系统关机时发送 |
一. trap捕捉到信号之后,可以有三种反应方式:
- 执行一段程序来处理这一信号
- 接受信号的默认操作
- 忽视这一信号
二. 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