关于trap的使用,请版主大哥进来看看

关于trap的使用,请版主大哥进来看看

我前几个月问过一个问题是如何让用户在执行一个脚本以后不能用ctrl+c退出来,在大家的帮助下,在版主大哥的支持下,我成功的用tarp命令实现了这个功能:

在脚本的第一行运行:
[code:1]trap "" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20[/code:1]

就可以让这个脚本不能被用户ctrl+c退出

现在我有一个变态的要求:

我用这个脚本调用的一个次级脚本

我需要这个次级脚本可以被ctrl+c退出到上一层,但是上一层仍然不能被ctrl+c退出

可是,我发现只要顶层脚本加上了tarp,他调用的子进程也加上trap了,不能ctrl+c退出去……天哪……
在trap里面加校验不行吗?
[code:1]export _PID=$$
trap " [ $$ -eq _PID ] && YOUR_FUNCTION || exit 65 " 2 3 15[/code:1]
楼上的大哥可以稍微详细一点吗?不是很清楚您的代码加在最顶层的shell里面还是调用的子shell里面?

export _PID=$$
_PID就是父进程,那么$$应该是父进陈
trap " [ $$ -eq _PID ] && 程序的名字 || exit 65 " 2 3 15
如果父进程等于父进陈,并且程序的名字或者退出
这个地方怎么理解?这个判断是在判断什么呢?
最后我选择了下面的代码:

[code:1]
export _PID=$$
trap " [ $$ -eq _PID ] || exit 65 " 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
19 20
[/code:1]
这个代码加在脚本的最开始:
export  _PID=$$就是取得当前进程的pid,当你中断的时候,trap就检查,如果当前的_PID和父shell的是一致的,就执行一个操作,如果不是(表明是在subshell中),就执行另外的操作。我是根据C语言里面fork()函数得到灵感的,但是我没有实践,因为在上班,不好意思,如果有问题我们再探讨。
_PID=&&  是取得当前进程的PID
[ $$ -eq _PID ]呢?在这个判断里面_PID是刚才主进程的PID,那$$又是什么呢?
判断进程的pid啊。如果你是在父进程里面发送信号,这个时候的_PID就是和$$相同的,但是如果你在子进程里面的话_PID和$$是不相同的,这个时候的$$是子进程的pid,肯定和在脚本一开始取得的父进程的pid不相同了。