linux基础之信号捕获bash5
扫描二维码
随时随地手机看文章
trap
例如,指南库脚本不会被意外中断,但是某些人在运行该库时会突然或无意中给您Ctrl +C,这就尴尬了。
有没有办法让我们的脚本在碰到ctrl+c时,还能继续执行,或者收到ctrl+c的终止执行的信号时,告诉执行者,此脚本执行时不能被随意中断。
有,bash允许内容对一些信号量捕获,可以在收到信号后执行指定的操作
信号,用kill或者快捷键发给指定的进程,进程收到后安装预设的规则处理,使用kill -l 可以查看系统可用的信号。
信号9,15 不可捕获,这些信号必须由操作系统处理,否则你写个死循环,kill -9 都杀不了,系统就崩了。
常用的快捷键信号
SIGINT,2,ctrl+c
SIGTSTP,18,ctrl+z,暂停
trap 'func "abc"' SIGINT,收到这个信号时,执行指定的代码
trap -- SIGINT,删除信号追踪
脚本示例
#! /bin/bash
trap 'func "abc"' SIGINT
trap "echo Goodbye." EXIT
index=0
func() {
echo 'abc', $1
index=$[index+1]
if [ $index -ge 10 ]; then
trap -- SIGINT
fi
}
eval
执行一个字符串,先把字符串中的变量替换为实际值
pipe="|"; eval ls $pipe wc -l
相当于 sh -c "ls $pipe wc -l"
set ls pwd
eval $1 #第一次扫描到$1为ls,第二次执行ls
exec
执行一个命令,把命令加载到当前的bash环境中执行,把当前bash的数据
所以exec执行后,执行栈会返回到当前bash的上一层,因为当前的bash环境已经被exec替换了
# su - user1
$ exec ls
ls执行完,会返回到root的环境下
time
记录程序执行的时间
还有一个time程序,比bash内置的time功能要多一点,可以用 \time ls,明确使用time程序而非bash的命令
umask
设置文件或者目录的权限掩码
在一个目录里设置权限掩码,那么这个目录里面新建的文件的权限规则是,目录:777-umask值,文件,666-umask值