首页/新闻资讯/正文详情

Hive 终端工具退出码权威指南:从 POSIX 约定到语义化退出状态

发布时间:2026/9/23 15:15:35 来源:云帆数科 栏目:资讯中心
Hive 终端工具退出码权威指南:从 POSIX 约定到语义化退出状态
Hive 终端工具退出码权威指南从 POSIX 约定到语义化退出状态【免费下载链接】hiveMulti-Agent Harness for Production AI项目地址: https://gitcode.com/gh_mirrors/hive48/hive导读本文是 Hive 项目中terminal-tools工具集的退出码速查与深度解析。它面向所有调用terminal_exec、terminal_job_logs等终端工具的 Agent 与开发者系统讲解 POSIX 退出码约定、信号导致的负退出码、以及 Hive 特有的「语义化退出状态」semantic_status机制——后者正是避免把grep无匹配、diff有差异这类正常退出 1误判为错误的关键。读完本文你将掌握完整退出码解读体系、exit_code为null时的三类场景以及如何通过源码与测试证据验证这些行为。本文内容主体源自 references/exit_codes.md它是 terminal-tools-foundations 技能 的配套参考文档。一、POSIX 退出码约定先建立基准心智模型任何进程退出时都会向父进程传递一个 0255 范围内的整数状态码。POSIX 约定是 Agent 解读一切退出结果的起点Hive 的terminal-tools完全遵循这一约定Code含义0成功Success1一般错误 / 兜底错误General error / catchall2Shell 内建命令误用、语法错误Misuse of shell builtins, syntax error126命令已找到但不可执行Command found but not executable127命令未找到Command not found128exit的参数无效Invalid argument toexit128 N被信号 N 杀死Killed by signal N130被 SIGINT 杀死Ctrl-C137被 SIGKILL 杀死143被 SIGTERM 杀死255退出状态超出范围Exit status out of range核心规则0永远表示成功非零值表示某种失败或特殊信息126/127专门用于启动失败而128 N这一组是 shell 层面对进程被信号终止的编码方式信号编号 128。二、负退出码envelope 中的信号化编码在 Hive 的标准 envelope 中exit_code还有一套与 shell 约定不同的编码——当exit_code 0时进程是被信号杀死的此时abs(exit_code)就是信号编号Whenexit_code 0in the envelope, the process was killed by a signal:abs(exit_code)is the signal number (subprocess uses negative codes for signaled exits, separate from the128 Nshell convention).这源于 Pythonsubprocess的行为进程被信号终止时returncode是负数信号号例如被 SIGKILL 杀死返回-9而不是 shell 的128 9 137。两种编码并存但语义清晰负退出码-N出现在 Hive envelope 的exit_code字段来自subprocess原生返回abs(exit_code)即信号编号128 N出现在你直接运行 bash 并让 shell 报告$?时是 shell 层面对信号终止的再编码。源码中exec.py在构建 envelope 时显式传递signaled(exit_code is not None and exit_code 0)见 exec.py而 JobManager 在后台作业结束时用更严格的判定record.signaled rc 0 or (rc ! 0 and abs(rc) in _SIGNAL_NUMBERS)见 jobs/manager.py——即只要返回码为负或非零且绝对值恰好落在已知信号编号集合内SIGINT、SIGTERM、SIGKILL、SIGHUP、SIGUSR1、SIGUSR2 等见同文件_SIGNAL_NUMBERS定义就判定为信号化退出。这一信息最终被semantic_exit.classify()转换为(signal, Killed by signal (exit {exit_code}))即 envelope 中的semantic_status: signal。三、语义化退出什么时候 exit 1 完全不是错误这是整个文档中最关键的实战知识点。许多常见命令把退出码 1 用作正常的信息性结果而非错误。如果 Agent 只读原始exit_code就会把grep没匹配到、diff文件有差异这类完全正常的结果误判为失败。terminal-tools将这些语义编码在semantic_status字段中Agent 应优先读取semantic_status命令退出码 0退出码 1退出码 ≥2grep/rg/ripgrep找到匹配matches found无匹配正常不是错误错误find成功部分目录不可读正常信息性错误diff文件相同文件不同正常信息性错误test/[条件为真条件为假正常信息性错误对不在该表中的任何命令默认约定仍然成立0 正常非零 错误。这套语义表的实现位于 tools/src/terminal_tools/common/semantic_exit.py核心数据结构_SEMANTICS精确对应文档表格_SEMANTICS: dict[str, dict[int, tuple[SemanticStatus, str | None]]] { grep: {0: (ok, None), 1: (ok, No matches found)}, rg: {0: (ok, None), 1: (ok, No matches found)}, ripgrep: {0: (ok, None), 1: (ok, No matches found)}, find: {0: (ok, None), 1: (ok, Some directories were inaccessible)}, diff: {0: (ok, None), 1: (ok, Files differ)}, test: {0: (ok, None), 1: (ok, Condition is false)}, [: {0: (ok, None), 1: (ok, Condition is false)}, }classify()函数的判定优先级依次为超时timed_out→error→ 信号化signaled→signal→ 退出码为Noneok对应 auto-backgrounded 仍在运行→ 查表命中 → 兜底默认语义。表内命令的已知退出码之外的取值如grep的 2、3…一律按error处理保证不会误把真正的失败放行。值得一提的实现细节_base_command会从 argv 或命令字符串中提取基础命令名剥离/usr/bin/之类的前缀并且对管道链只考察最后一个命令因为 shell 传播的是管道末尾的退出码。对shellTrue的字符串这种取最后一段的解析是显式标注的启发式官方注释指出它仅供标注语义、不涉及安全边界见 semantic_exit.py。测试验证exit 1 semantic_status ok仓库测试 test_terminal_tools_exec.py 直接固化了这一行为def test_grep_no_matches_is_ok_not_error(exec_tool, tmp_path): f tmp_path / haystack.txt f.write_text(apples\nbananas\n) result exec_tool(commandfgrep zzz {f}) assert result[exit_code] 1 assert result[semantic_status] ok assert No matches found in (result[semantic_message] or )同文件的test_diff_files_differ_is_ok_not_error亦验证diff两文件不同时exit_code 1且semantic_status ok、semantic_message含differ。这两个用例是理解何时读semantic_status而非裸exit_code的最佳实证。实操规则规则一永远先检查semantic_status。它只有三档ok/signal/error。规则二仅当你确实需要精确数值时例如区分make的 1 与 2才回退到exit_code。规则三看到semantic_status: ok且semantic_message为No matches found/Files differ时不要恐慌——这是命令在正常履行职责。四、exit_code 为 null三种必须区分的场景envelope 中的exit_code并非总是整数文档明确列出null的三种情形auto_backgrounded: true——进程仍在运行已被移交到后台作业持有job_id。此时应改用terminal_job_logs轮询支持since_offset增量读取、wait_until_exit阻塞等待见 jobs/tools.py而不是把null当作失败。Pre-spawn 错误命令未找到、exec 失败——此时 envelope 的error字段会给出具体原因。实现上对应 exec.py 中的_err_envelope()捕获FileNotFoundError返回command not found: ...捕获其他OSError返回spawn failed: ...并置semantic_status: error、exit_code: null。测试test_terminal_tools_exec.py也断言了此场景semantic_status error或error字段存在、semantic_message含not found。timed_out: true且进程拒绝退出——极为罕见此时内核才有答案如僵尸进程或不可中断的 D 状态不要指望从退出码获得信息。注意classify()对exit_code is None且未超时、未被信号化的情形返回(ok, Still running)——这正是 auto-backgrounded 场景的语义化表达见 semantic_exit.py。五、常见信号导致的退出速查表文档给出两套信号编码的对照是排查进程为何非零退出的高频查表信号编号Subprocess 退出码Shell 退出码含义SIGHUP1-1129终端挂断Terminal hangupSIGINT2-2130中断Ctrl-CSIGQUIT3-3131退出Ctrl-\SIGKILL9-9137强制杀死不可捕获SIGTERM15-15143礼貌终止SIGSEGV11-11139段错误SIGABRT6-6134中止断言失败等读表要点Subprocess 退出码负值 Hive envelope 中exit_code的取值abs()即信号号Shell 退出码128 N 你在交互式 bash 中执行echo $?得到的值同一个信号在两套体系中数值不同解读前先确认数据来源。在 Hive 的作业工具中信号操作被封装为具名动作terminal_job_control支持signal_termSIGTERM、signal_killSIGKILL、signal_intSIGINT、signal_hupSIGHUP、signal_usr1、signal_usr2文档建议按先signal_int优雅中断 → 数秒后signal_term→ 最后signal_kill的顺序逐级升级见 jobs/tools.py。六、退出码在标准 envelope 中的完整位置退出码不是孤立字段它与semantic_status、semantic_message、warning等共同构成terminal_exec的标准返回结构完整 envelope 定义见 terminal-tools-foundations SKILL{ exit_code: 0, // null 时见上文第四节 semantic_status: ok, // ok | signal | error — 优先读它 semantic_message: null, // 如 grep 无匹配时的 No matches found warning: null, // 如 rm -rf 的 may force-remove files auto_backgrounded: false, // true 时 exit_code 为 null转 job_id 轮询 job_id: null, timed_out: false, shell_kind: bash // bash | powershell | cmd | direct }envelope 的组装逻辑集中在 common/truncation.pybuild_exec_envelope()先做输出截断默认max_output_kb 256溢出时把完整字节存到output_handle再调用classify()得出semantic_status/semantic_message最后通过get_warning()附加破坏性命令警告。退出码解读、输出截断、破坏性警告三者是一套整体机制semantic_status是其中承载退出码语义的一等公民。七、实战总结Agent 解读退出码的四步流程结合文档与源码推荐所有调用终端工具的 Agent 遵循以下流程先看semantic_statusok直接继续signal查信号表判断是被谁杀的常见为signal_int/signal_term/signal_killerror再往下看。exit_code为null检查auto_backgrounded/job_id转为轮询、error字段pre-spawn 失败、timed_out内核级异常。exit_code非零但semantic_status为ok这是grep/rg/find/diff/test的信息性退出读取semantic_message了解具体含义。exit_code为负abs()即信号编号对照上表如-9 SIGKILL、-15 SIGTERM还原真相。这套约定让终端工具返回退出码从一串难懂的整数变成了 Agent 可直接执行的决策信号——这也是 terminal-tools-foundations 将读懂semantic_status而非裸exit_code列为必读技能的根本原因跳过它就会把grep无匹配误判为错误、把正常退出的后台任务当成丢失产生工具返回空输出式的误报与恐慌。【免费下载链接】hiveMulti-Agent Harness for Production AI项目地址: https://gitcode.com/gh_mirrors/hive48/hive创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Click Context 深度指南:掌握 ctx 状态共享、命令调用与资源管理的核心机制
Click Context 深度指南:掌握 ctx 状态共享、命令调用与资源管理的核心机制

人工智能AI 应用AI Agent 【免费下载链接】Tutorial-Codebase-Knowledge Pocket Flow: Codebase to Tutorial 项目地址: https://gitcode.com/gh_mirrors/tu/Tutorial-Codebase-Knowledge 点击查看 免费下载 本文基于 Tutorial-Codebase-Knowledge 仓库的 Click 系… · 2026/9/23 15:15:34

13.8V 10A线性稳压电源设计:7812扩流与过压过流保护
13.8V 10A线性稳压电源设计:7812扩流与过压过流保护

简介:这份资料围绕13.8V 10A线性稳压电源展开,面向电子竞赛电源类赛题选手、电子工程专业学生及电源设计入门者,帮助解决大电流、低噪声稳压电源的设计与制作问题。资源包为1个PDF文件,约37KB,内容涵盖电源供给、整流滤… · 2026/9/23 15:15:28

深入 ASM 核心组件:ClassVisitor、ClassReader 与 ClassWriter 的类分析与转换实战
深入 ASM 核心组件:ClassVisitor、ClassReader 与 ClassWriter 的类分析与转换实战

深入 ASM 核心组件:ClassVisitor、ClassReader 与 ClassWriter 的类分析与转换实战 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更… · 2026/9/23 15:15:28

揭秘游戏软件开发公司底层优化:手写实现让帧率翻倍
揭秘游戏软件开发公司底层优化:手写实现让帧率翻倍

揭秘游戏软件开发公司底层优化:手写实现让帧率翻倍 看了一堆教程还是不会写项目?这大概是很多刚入行或者想进阶的开发者的痛点。视频里跑得飞起,自己上手就卡壳,尤其是面对大型商业项目时,那种无力感特别强。很多培训机构教你“怎么调用库”,但很少教你… · 2026/9/23 15:56:01

3步搞定自动化测试流程图解原理,新手也能跑通
3步搞定自动化测试流程图解原理,新手也能跑通

3步搞定自动化测试流程图解原理,新手也能跑通 刚把 GitHub 上那个热门的 pytest 示例项目拉下来,满心欢喜地敲下 pytest ,结果终端直接红屏报错: ModuleNotFoundError: No module named… · 2026/9/23 15:55:55

告别配置地狱:2026最新置换贴图实战,水利全栈必备
告别配置地狱:2026最新置换贴图实战,水利全栈必备

告别配置地狱:2026最新置换贴图实战,水利全栈必备 是不是每次想给模型加点“高级感”,一查文档就头大?光是配置环境、找对格式、调参数就能卡半天,代码跑起来全是红字,让人怀疑人生。别急,这种痛苦在 2026最新 的图形管线里完全有解。… · 2026/9/23 15:55:55

PR视频怎么导出实战项目新手避坑指南
PR视频怎么导出实战项目新手避坑指南

PR视频怎么导出实战项目新手避坑指南 看了一堆教程还是不会写项目?别慌,这是大多数开发者和内容创作者的通病。你盯着屏幕上的代码或时间轴,感觉每一步都懂了,但一动手就报错,或者导出的视频根本没法用。其实, pr视频怎么导出… · 2026/9/23 15:55:49

DeepSeek API 自动化编程助手实战:从代码生成到自检修复
DeepSeek API 自动化编程助手实战:从代码生成到自检修复

简介:面向希望借助DeepSeek API构建自动化编程工具的开发者,这份PDF文档系统拆解了从API基础到助手落地的完整流程。全文共19页,仅含1个PDF文件,压缩包约1.78MB,便于快速学习与直接查阅。内容先从自动化编程发展背景切… · 2026/9/23 15:55:36

搞定万能收款码这3个高频面试题,性能提升5倍
搞定万能收款码这3个高频面试题,性能提升5倍

搞定万能收款码这3个高频面试题,性能提升5倍 是不是经常遇到这种尴尬:代码写得溜,但一碰到【万能收款码】这种高并发支付场景,脑子就一片空白?明明知道要用异步、要用缓存,可具体怎么搭项目,怎么在毫秒级响应里把状态流转跑通,心里没底。这不仅是开… · 2026/9/23 15:55:30

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码