Skip to content

无人值守的 claude -p 别再“假成功”:2.1.317/2.1.318 补上写盘失败和配置损坏的报错 ​

脚本和 CI 里跑 claude -p,最怕两种事:明明出了问题,退出码却是 0;或者配置文件被悄悄改掉,你却不知道。最近两个版本各补了一块。

2.1.317:写盘失败不再退出 0 ​

按 2.1.317 的更新说明,修复了这样一种情况:磁盘写满或配额用尽,导致 transcript 或 ~/.claude.json 的写入丢失,而 claude -p 仍然以 0 退出。

现在的行为是:

  • 会打印一条错误;
  • 在 text 和 json 输出格式下,退出码为 1。

说明里还有一句提醒:写满的 NFS 导出目录可能仍然检测不到。所以如果你的家目录在网络文件系统上,别把这个退出码当成万无一失的保险。

2.1.318:~/.claude.json 不是合法 JSON 时,不再被默认值覆盖 ​

2.1.318 修的是另一头。以前,非交互启动遇到一个不是合法 JSON 的 ~/.claude.json 时,会直接用默认值把它替换掉。现在改成:

  • 启动失败;
  • 说明如何恢复这个文件;
  • 文件原样保留,不去动它。

同一批修复里还有几处相关的小改动:

  • 一个空的 ~/.claude.json、又没有备份时,不再被报告为「已损坏」,Claude Code 会按文件缺失时的方式正常启动;
  • 对损坏或缺失的 ~/.claude.json,打印出来的恢复命令不再指向空的或被截断的备份,也不会在只读文件上失败;
  • 如果一个主目录只跑 claude -p,之前清理保留数据时可能留不下 ~/.claude.json 的备份,现在会先做一份新备份,再删除最后一份好的。

顺带:不必要的反复重写也少了 ​

2.1.318 还有一条改进:无人值守运行(claude -p、SDK 应用)在文件内容没有变化时,不再每次运行都重写 ~/.claude.json。写得少,在网络家目录或紧张的磁盘上出问题的机会自然也少。

在脚本里怎么用得上 ​

  • 检查退出码:在 CI 或定时任务里,别只看 stdout;非 0 的退出码现在能覆盖写盘失败这类情形;
  • 监控磁盘和配额:退出 1 通常意味着该看看磁盘空间或配额了;
  • 损坏时先别手动覆盖:看到启动失败并给出恢复说明,按提示恢复即可,不必从头重建;
  • 网络家目录:这类环境仍有检测盲区,重要任务建议额外做健康检查。

小结 ​

2.1.317 让 claude -p 在写盘失败时诚实地报错并退出 1,2.1.318 让它在遇到损坏的 ~/.claude.json 时停下来而不是悄悄重置。两处都是同一个方向:无人值守的任务,出了问题就该说出来。

Claude-cn.org,专注于 Claude Code 中文教程