linux – Bash:为什么当脚本陷阱SIGINT时,父脚本不会在SIGINT终
script1.sh:
#!/bin/bash ./script2.sh echo after-script script2.sh: #!/bin/bash function handler { exit 130 } trap handler SIGINT while true; do true; done 当我从终端启动script1.sh,然后使用Ctrl C将SIGINT发送到其进程组时,该信号被script2.sh捕获,当script2.sh终止时,script1.sh将打印“after-script”.但是,我会期望script1.sh在调用script2.sh的行后立即终止.为什么在这个例子中不是这样? 附加说明(编辑): >由于script1.sh和script2.sh位于同一进程组中,因此在命令行上按Ctrl C时,SIGINT将发送到两个脚本.这就是为什么当脚本2.sh退出时,我不会指望script1.sh继续. 解决方法
新答案:
这个问题比我原来怀疑的更有趣.答案基本上在这里给出: What happens to a SIGINT (^C) when sent to a perl script containing children? 这是相关的tidbit.我意识到你不使用Perl,但我认为Bash正在使用C的惯例.
This explanation是我见过的最好的选择.它也说Bash做WCE方法.也就是说,当父进程收到SIGINT时,它等待它的子进程返回.如果处理的处理从SIGINT退出,它也退出SIGINT.如果孩子以其他方式退出,则忽略SIGINT.
我在Bash手册页中找不到这个引用,但我会继续查看信息文档.但是我99%的人相信这是正确的答案. 老回答: Bash脚本中的命令的非零退出状态不会终止该程序.如果你做一个echo $?之后./script2.sh将显示130.您可以通过使用set -e作为phs建议终止脚本. $help set ... -e Exit immediately if a command exits with a non-zero status. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |