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

2024-03-12

脚本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

When I start script1.sh from a terminal, and then use Ctrl+C to send SIGINT to its process group, the signal is trapped by script2.sh and when script2.sh terminates, script1.sh prints "after-script". However, I would have expected script1.sh to immediately terminate after the line that invokes script2.sh. Why is this not the case in this example?

补充说明(编辑):

  • As script1.sh and script2.sh are in the same process group, SIGINT gets sent to both scripts when Ctrl+C is pressed on the command line. That's why I wouldn't expect script1.sh to continue when script2.sh exits.

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


新答案:

这个问题远比我最初想象的有趣。答案基本上在这里给出:

当发送到包含子项的 Perl 脚本时,SIGINT (^C) 会发生什么情况? https://stackoverflow.com/questions/4717118/what-happens-to-a-sigint-c-when-sent-to-a-perl-script-containing-children

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

Perl 的内置系统函数的工作方式与 C 系统类似(3) 就信号而言,来自标准 C 库的函数。 如果您使用 Perl 版本的 system() 或管道打开或反引号, 然后是父级——一个调用系统而不是被调用的系统 它 - 当孩子们在的时候会忽略任何 SIGINT 和 SIGQUIT 跑步。

这个解释 http://www.cons.org/cracauer/sigint.html这是我见过的关于可以做出的各种选择的最好的。它还说 Bash 采用 WCE 方法。也就是说,当父进程收到 SIGINT 时,它会等待子进程返回。如果该进程从 SIGINT 处理退出,它也会以 SIGINT 退出。如果子进程以任何其他方式退出,它将忽略 SIGINT。

还有一种方法可以让调用 shell 判断被调用的是否是 程序在 SIGINT 时退出,并且如果它忽略 SIGINT(或将其用于 其他目的)。与 WUE 方式一样,shell 等待子进程 完全的。它计算程序是否在 SIGINT 时结束,如果 所以,它停止了脚本。如果程序执行任何其他退出, 脚本将继续。我将这种做事方式称为 本文档的其余部分使用“WCE”(“等待并合作退出”)。

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

旧答案:

Bash 脚本中命令的非零退出状态不会终止程序。如果你做一个echo $? after ./script2.sh它将显示 130。您可以使用以下命令终止脚本set -e正如 phs 所建议的那样。

$ help set
...
-e  Exit immediately if a command exits with a non-zero status.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash:当子脚本捕获 SIGINT 时,为什么父脚本不会在 SIGINT 上终止? 的相关文章

  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • 如何在两个不同帐户之间设置无密码身份验证

    我们可以在两台机器的两种不同用途之间设置无密码身份验证吗 例如 计算机A有用户A 计算机B有用户B 我们可以设置密码 ssh 以便计算机 A 上的用户 A 使用其用户帐户 A 登录计算机 B 谢谢你 如果我理解你的问题 你能设置一下吗ssh
  • bash 函数保留制表符补全

    我把函数 make color make 1 ccze A in bashrc获得彩色的 make 输出 他的作品很好 但是make用于选择目标的制表符补全功能丢失 有什么方法可以保留函数中命令的制表符完成 或者我可以做其他事情来实现制表符
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • Bash:循环遍历字符串数组后无法读出带空格的字符串

    我正在使用循环读取数组的内容 该数组包含名为 music 的目录层次结构中的所有目录和文件 内容是 find 命令先前输出的字符串 这个想法是根据流派 艺术家和标题将 directory contents 中每个数组元素的完整目录路径分成子
  • 如何在 mac 中使用“getopt”命令让 bash 处理长参数?

    我想让我的 bash 脚本处理长参数 我发现getopt 但 OS X 不支持它 谁能告诉我为什么getoptBSD 实现了 GNU 没有实现 我尝试构建getopt在 GNU C lib 中 但由于我对 Linux 的技能不佳而失败了 有
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • 错误:NVIDIA-SMI 失败,因为无法与 NVIDIA 驱动程序通信

    NVIDIA SMI 抛出此错误 NVIDIA SMI 失败 因为无法与 NVIDIA 通信 司机 确保安装了最新的 NVIDIA 驱动程序并且 跑步 我清除了 NVIDIA 并按照提到的步骤重新安装了它here https askubun
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 确保 config.h 包含一次

    我有一个库项目 正在使用 Linux 中的 autotools 套件移植到该项目 我对自动工具很陌生 本周 我已经了解了其操作的基础知识 我有一个关于如何保留内容的问题config h免遭重新定义 我惊讶地发现生成的config h文件也没
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • 命令运行时从 shell_exec 命令获取输出

    我正在编写一个 PHP 脚本网页 该网页旨在接受先前上传到服务器的 JFFS2 图像的文件名 然后 该脚本将使用映像重新刷新服务器上的分区 并输出结果 我一直在用这个 tmp shell exec update flash v filena
  • 如何在 bash 中结合超时和 eval 命令

    为了执行存储在变量中的命令eval使用命令 gt a echo e a nb wc l gt eval a 2 但如何才能与它结合起来呢 timeout命令 我尝试过以下操作 这给了我错误的输出 gt timeout 10 a a b wc
  • 将 JSON 数组转换为 bash 数组并保留空格

    我想将 JSON 文件转换为 bash 字符串数组 稍后我可以对其进行迭代 我的JSON结构如下 USERID TMCCP CREATED DATE 31 01 2020 17 52 USERID TMCCP CREATED DATE 31
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b

随机推荐

  • 参数里面的冒号是什么意思? [复制]

    这个问题在这里已经有答案了 words pron dict str 上的冒号是什么意思 我在 python 2 7 上遇到语法错误 是Python 3吗 我该如何使用它 class TextToSpeech CHUNK 1024 def i
  • DDD 中哪一层应该包含查询

    我有一个简单的 DDD 服务 带有文章聚合根 我使用 MediatR 和 CQRS 来分离命令和查询 在 DDD 域中不应依赖于应用程序和基础设施层 我有一个存储库 IArticleRepository 用于从文章数据库中组合一些数据 我有
  • 显示字符串的可能组合

    我试图获取一个字符串并显示它的可能组合 在 PHP 中 但同时按每个单词的顺序说出 例如 你好吗 将返回 一个数组 How are you How are are you how you are 我现在的代码显示了所有组合 但我希望它保持它
  • OnLoad方法和Load事件之间的区别?

    有什么区别OnLoad方法和Load事件 我正在开发 WinForm 控件 我应该注册到Load事件或覆盖OnLoad方法 每一种的优点和缺点是什么 我会去覆盖OnLoad 这样您就可以节省 CPU 周期来调用事件处理程序 如果您从控件继承
  • 单元测试 MVC 控制器

    我的 ASP NET MVC 应用程序中的控制器根据几个相当简单的规则预先填充我的视图显示的表单数据 在我的单元测试中涵盖这似乎是一件好事 但我能看到验证表单中是否放置了正确数据的唯一方法是以一种不自然的方式从控制器中提取逻辑 有人可以提出
  • 如何在Sphinx中展开侧边栏目录树上的所有小节?

    我想知道是否有一种方法可以扩展包含在标题下的所有小节index rst file 举个例子 它是这样的 Section 1 Section 2 Section 3 这就是我希望的样子 Section 1 Subsection 1 1 Sub
  • 如何手动渲染表单字段并设置其初始值?

    我正在尝试手动渲染表单的字段 以便我的设计师同事可以操作 HTML 中的输入元素 而不是在 Python 源代码中苦苦挣扎 IE 而不是像这样声明表单字段 form first name 其实我确实
  • 静态发布和 HTTPS

    遵循这个问题 大型网站上 Silverstripe 的静态发布 https stackoverflow com questions 46313840 static publishing in silverstripe on large si
  • 生成偶数随机数

    我需要一个代码来仅生成随机偶数 2 100网上有生成随机数的教程 但它们有奇数和偶数 请理解我只需要生成偶数 1 生成数字1 50 2 将所有数字乘以2 所有数字乘以 2 都是偶数
  • Selenium 使用相对 XPath 定位器显式等待

    将 Selenium WebDriver 与 Python 3 4 结合使用 我正在编写一个抓取工具 并使用相对于某些非根祖先元素的 XPath 来定位元素 如下所示 ancestor element driver find element
  • Julia 中的并行梯度计算

    不久前我被说服放弃我舒适的 matlab 编程并开始使用 Julia 编程 我已经在神经网络方面工作了很长时间 我认为现在有了 Julia 我可以通过并行计算梯度来更快地完成工作 不需要一次性对整个数据集计算梯度 相反 我们可以拆分计算 例
  • SQL 中的标准差命令

    在 C 中从数据库检索数据后 我必须实现标准差 我必须从字段名称中检索一组值income其中性别是male or female 有没有直接计算标准差的SQL命令 或者我应该使用 C 单独计算它 Try the STDEV http msdn
  • 将 C++ 字符串变量转换为 long

    我有一个变量 string item 它在运行时初始化 我需要将其转换为长 怎么做 我尝试过 atol 和 strtol 但对于 strtol 和 atol 总是分别出现以下错误 cannot convert std string to c
  • 模板 typedefs - 你的工作是什么?

    C 0x 有模板别名 有时称为模板类型定义 看here http en wikipedia org wiki C 2B 2B0x Alias templates 当前的 C 规范没有 您喜欢用什么来解决问题 容器对象还是宏 你觉得值得吗 您
  • jQuery Mobile 使用 AJAX 数据增长文本区域

    我正在通过以下方式将文本加载到输入框 textarea val ajaxData 但是它不会自动增长 并且我的数据未完全显示 有什么方法或任何东西可以调用来强制更新吗 确实有一个内部函数负责调整大小 称为resizeCheck 但是 该函数
  • 如何使用 Javascript/Jquery 添加子元素

    我需要一位帮助 我需要使用 Javascript Jquery 中的按钮单击来添加子元素 我将在下面解释我的代码 div class form group div
  • RMarkdown / pandoc 无法使用乳胶颜色命令编织 Pdf

    Mac 操作系统 10 11 6 R版本 3 3 1 MacTex 2016 TexLive 6 2 2 RMarkdown 1 0 9014 针织 1 14 潘多克 1 17 当乳胶命令如下时 RMarkdown 无法编织 PDF tex
  • 如何将参数传递给使用“include”呈现的PHP模板?

    需要 PHP 模板方面的帮助 我是 PHP 新手 我来自 Perl Embperl 无论如何 我的问题很简单 我有一个小模板来渲染一些项目 让它成为一篇博客文章 我知道使用此模板的唯一方法是使用 include 指令 我想在遍历所有相关博客
  • DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER 错误

    我的包由动态数据库连接组成 当我运行我的包时 它抛出类似 DTS E CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER 的错误 对连接管理器 conn 的 AcquireConnection 方法调用
  • Bash:当子脚本捕获 SIGINT 时,为什么父脚本不会在 SIGINT 上终止?

    脚本1 sh bin bash script2 sh echo after script 脚本2 sh bin bash function handler exit 130 trap handler SIGINT while true do