gpt4 book ai didi

linux - Bash:当子脚本捕获 SIGINT 时,为什么父脚本不会在 SIGINT 上终止?

转载 作者:IT王子 更新时间:2023-10-28 23:54:20 24 4
gpt4 key购买 nike

脚本1.sh:

 #!/bin/bash    

./script2.sh
echo after-script

脚本2.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 两个脚本kbd> 在命令行上被按下。这就是为什么我不希望 script1.sh 在 script2.sh 退出时继续。

  • 当 script2.sh 中的“trap handler SIGINT”行被注释掉时,script1.sh 会在 script2.sh 存在后立即退出。我想知道为什么它的行为会有所不同,因为 script2.sh 会产生相同的退出代码 (130)。

最佳答案

新答案:

这个问题比我原先怀疑的要有趣得多。答案基本上在这里给出:

What happens to a SIGINT (^C) when sent to a perl script containing children?

这是相关的花絮。我知道您没有使用 Perl,但我假设 Bash 使用的是 C 的约定。

Perl’s builtin system function works just like the C system(3) function from the standard C library as far as signals are concerned. If you are using Perl’s version of system() or pipe open or backticks, then the parent — the one calling system rather than the one called by it — will IGNORE any SIGINT and SIGQUIT while the children are running.

This explanation是我所见过的关于可以做出的各种选择的最好的。它还说 Bash 执行 WCE 方法。也就是说,当父进程收到 SIGINT 时,它会等待直到其子进程返回。如果该处理的进程从 SIGINT 退出,它也会以 SIGINT 退出。如果 child 以任何其他方式退出,它会忽略 SIGINT。

There is also a way that the calling shell can tell whether the called program exited on SIGINT and if it ignored SIGINT (or used it for other purposes). As in the WUE way, the shell waits for the child to complete. It figures whether the program was ended on SIGINT and if so, it discontinue the script. If the program did any other exit, the script will be continued. I will call the way of doing things the "WCE" (for "wait and cooperative exit") for the rest of this document.

我在 Bash 手册页中找不到对此的引用,但我会继续查找信息文档。但我有 99% 的信心这是正确答案。

旧答案:

Bash 脚本中命令的非零退出状态不会终止程序。如果您在 ./script2.sh 之后执行 echo $?,它将显示 130。您可以使用 set -e 终止脚本,如下所示phs 建议。

$ help set
...
-e Exit immediately if a command exits with a non-zero status.

关于linux - Bash:当子脚本捕获 SIGINT 时,为什么父脚本不会在 SIGINT 上终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com