现状口径:/keil-build 与 /serial-boot-test 是 DSH 会话的技能调用名, 不是 shell 命令;「名 + 命令行参数」的命令形态改为可执行体 run_boot_test.py 的真实调用。 - AGENTS.md:别名说明重写为「技能调用名不是 shell 命令」,两条目改 「编译(/keil-build)」「串口回归(/serial-boot-test)」 - keil-build / serial-boot-test 两 skill 调用名与示例同步;task-worktree 方案文档去掉 @build/@test 惯例从句;@task 保留(不在点名范围) - 123 文件现状陈述全改;台架捕获、变更记录/时间线、rename 映射输入 等 41 行历史证据保留旧名 - gen_memory_svg.py 6 处措辞随改,3 张 SVG 产物同批重跑 - 顺手补并行方案同行漏网计数 51→52 钩子 验证:提交期快钩子对 123 文件实跑全 Passed;check_doc_links --all rc=0(3038 处、无法判定 0);check_mermaid --all rc=0;YAML 解析 52 钩子不变;skill-size rc=0;py_compile 全过;字节卫生零漂移。
3.2 KiB
调用形态:先认执行器是哪个 shell(2026-10-26 实测)(自 SKILL.md 外置)
本文由 keil-build 的 SKILL.md「调用形态:先认执行器是哪个 shell(2026-10-26 实测)」一节逐字外置而来(渐进展开:主文件只留索引与指针)。步骤号沿用原文,未重编。
同一条编译命令,PowerShell 与 bash 是两种写法;ops_bash / run_code 起的是
/usr/bin/bash -c,不认 PowerShell 形态,照抄仓库 AGENTS.md 会直接语法错退出。
| 执行器 | 正确写法(cwd = 仓库根) |
|---|---|
| PowerShell | & '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py |
bash(ops_bash) |
'.venv/Scripts/python.exe' .dsh/skills/keil-build/scripts/keil_build.py |
- bash 侧去掉前导
&(bash 里&是"丢后台",不是调用操作符)、路径改正斜杠 (\Scripts\python.exe的反斜杠在 bash 是转义,路径根本解析不出来)。 - 实测(step 41→42):把 PowerShell 形态丢进
ops_bash后台任务 → 任务秒退、exit 2,stderr 只有这一行:
/usr/bin/bash: -c: line 1: syntax error near unexpected token `&'
- ⚠ 这个 2 不是脚本的环境错误 2:脚本自己报环境错误会打出
BuildEnvError/ 中文诊断(UV4 找不到、工程找不到、档案解析失败),而语法错连解释器都没启动,MDK-ARM/build_log.txt不会被改写。判据:stderr 含syntax error near unexpected token= 写法问题 → 换 bash 形态重跑,别去查DTU_KEIL_UV4、别当环境错误排障。 - 后台跑(
run_in_background: true)时要自己收码,且别把脚本接进管道:'.venv/Scripts/python.exe' .dsh/skills/keil-build/scripts/keil_build.py; rc=$?; echo RC=$rc。 实测脚本 | tail -6; echo RC=$?里的$?是tail的退出码(恒 0), 拿它当 PASS/FAIL 会永远"绿";set -o pipefail能透出非零码,但尾巴上挂的grep无匹配时同样报 1,也不可信。要看报错行就单独 grep 日志:grep -a -E 'Error|error:|Warning' MDK-ARM/build_log.txt。
解析顺序(命令行 > 项目档案 .serialtest/config.json > 环境 > 探测):
工程 uvprojx(档案缺省时自动搜 cwd 下唯一 *.uvprojx);UV4 uv4 >
$DSH_KEIL_UV4 > $DTU_KEIL_UV4 > PATH(显式设了但路径无效 = 立即报错,不静默回退)。
退出码:0=PASS(0错0警) / 1=构建失败(打印报错行)/ 2=环境错误(UV4 找不到或
路径无效、工程找不到、档案解析失败)/ 3=用法错误 / 4=build 锁被占用(并发 -b 不可行)。
收到 2 先确认它是脚本打的还是 shell 语法错打的(见上节),再走"环境错误"排障。
2026-10-12 修正:旧实现把环境错误写成
raise SystemExit("...")→ 实际退出码是 1, 而用法错误由 argparse 抛SystemExit(2)→ 恰好占了"环境错误"的位置。故AGENTS.md/new-machine-setup里写的"报 exit 2 = 环境问题"当时不成立。现按文档口径改正: 环境错误 → 2(BuildEnvError),用法错误 → 3(覆盖 argparse 的error())。