claude -p 不再丢掉前面几轮的正文

Claude Code 2.1.295 修复 claude -p 的文本输出:后台工作又开了一轮时,以前会丢掉更早几轮的回复。现在每一轮在该轮结束时打印。说明没有写交互式终端的回显也丢过,也没有取消 2.1.292 里对后台命令的等待。

claude -p 不再丢掉前面几轮的正文

脚本只抓到最后一段话,前面的结论像没打印过。Claude Code 2.1.295 写:claude -p 的文本输出在后台工作又开始一轮时,会丢掉更早的回复。现在每一轮的回复在该轮结束时打印。claude -p 前面的输出 从这一版起应保留。说明没有写交互式全屏终端也丢过这些轮。

作者:CodePass 技术编辑

丢的是已结束轮的正文,不是后台进程

2.1.292 修过一次性 -p 在最终结果后约 5 秒停掉后台命令,现已改为等待,见 不再提前停后台命令。那是进程被停。2.1.295 这条是文本输出把更早几轮从 stdout 里拿掉,因为后台工作又开了一轮。命令可以仍在跑,你抓到的文字却只剩最后一轮。升级后,每一轮结束就打印该轮,不等到整个进程退出才吐出唯一一段。

说明没有写 JSON 输出模式是否同一缺陷,只点了文本输出。用 --output-format json 的脚本不要用这句直接改解析。文本模式下,若你用「进程结束时 stdout 只有最后一段」来取答案,升级后 stdout 里会有多段,按轮出现。解析器要能接受中间结果,而不是只读最后一个字节之前的整块。

还在等什么,会写到 stderr

同一版加了一行:当 stderr 是终端,并且 claude -p 在最后一轮之后仍开着,会说明它在等什么。这行在 stderr,不在正文 stdout。把它和模型回复拼在一起,会污染你要提交的文本。等的可能是后台命令,和 2.1.292 的「改为等待」对得上。正文按轮打印、等待原因走 stderr,两边不要合成一个流。

低于 2.1.295 的脚本若把 stdout 重定向到文件,文件里可能只有最后一轮。升级后同一文件会按时间顺序多出前面几轮。用 tail 取最后一段作为提交信息的流水线仍然可用。用「整个文件等于最终答案」的流水线会把较早的计划也提交进去。先在一台 2.1.295 上跑一条会触发后台的 -p,看文件里有几段,再改解析。交互式终端不在这句的修复范围内,全屏里的滚动历史不要用这条解释。

参考资料