You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
现象
在 VTE 系终端(GNOME Terminal 等,环境里存在
VTE_VERSION)里使用侧边栏或底栏终端时,每敲一条命令都会多出一行内部文本:这一行与命令输出粘在同一个物理行上(
ls/printf的结果接在它后面),用户看到的"多余输出"就是它。根因
三层叠加:
/etc/profile.d/vte.sh(Ubuntu 上是vte-2.91.sh)在交互 shell 中把 PS0 设为ESC ]777;preexec ESC \—— 值的最后一个字符是反斜杠;该脚本的注释本身就写着 "Prepend to the user's PS0"。prepareShellActivity()先builtin source ~/.bashrc(shell-activity.ts#L73),再执行PS0+=${quote(...)}(shell-activity.ts#L92),于是 PS0 变成…ESC \+$(builtin printf … >| /tmp/dsh-shell-*/state)。\$解码成字面$。 命令替换不再执行,整段原样写进终端;终端随后把ESC $ ( b当成字符集指定(SCS:$(选 VT100 线框字符集b)序列吃掉,屏幕上只剩从uiltin开始的文本——与截图逐字节一致。同一个片段在
shopt -u promptvars(关闭提示符变量展开)的 shell 里还会以未展开形态整段打印。影响
@xterm/headless维护屏幕,实测快照文本同样是uiltin printf …,agent 读屏也会看到这一行,会污染terminal工具拿到的输出;$(...)没有执行,state收不到busy,循环/长命令期间 activity 一直是idle(实测 master 上while :; do :; done期间 state 停在146:2:idle),真正落盘的只有 PROMPT_COMMAND 的 idle/unknown 迁移。最小复现
在 GNOME Terminal(任何
VTE_VERSION存在的终端)里:不依赖界面、用同样 rcfile 的纯 bash 复现:
建议修复(已有分支)
分支:https://github.com/Shen-Cao/deepseek-harness/tree/fix/shell-activity-ps0-prepend
两个 commit,彼此独立、可分别取舍:
f43481a8前插而非追加:PS0=<fragment>"${PS0-}"。用户/VTE 自己的 PS0 仍留在末尾,尾部的\就不会紧贴我们的$(;这与 VTE 自身以及 systemd 的80-systemd-osc-context.sh的 prepend 做法一致;${PS0-}兼容set -u。df86c66dpromptvars 守卫:仅当shopt -q promptvars时安装片段,否则整段跳过(那种 shell 里装上去只会被原样打印;代价是该 shell 失去 busy 采样,已写入包 README 的 Known Limitations)。回归测试在
packages/subprocess/subprocess-local/tests/shell-activity.spec.ts新增两个真实交互 shell 用例:set -u:输出不含builtin printf、OSC 仍然出现、循环期间 activity 为busy、^C后为idle;shopt -u promptvars:输出不含builtin printf。两个用例在 master 上分别失败、在分支上通过(已用同一份 spec 对两个实现各跑一次确认红→绿)。
验证
prepareShellActivity()生成的 rcfile):修复后无回显,while :; do :; done期间 state 为busy(如97:2:busy),^C后idle;master 上每次提示符打印一次 payload 且循环期间 state 恒为idle。vitest run packages/subprocess/subprocess-local/tests/shell-activity.spec.ts→ 3 passed / 6 skipped(本机无 zsh);oxlint0 warnings / 0 errors。.zshenv的 precmd/preexec)不涉及 PS0,未改动。与 #12547 的关系与去重
#12547 报告了同一现象,并给出了同向前插建议;本贴是独立静态分析 + 可直接合并的补丁分支和红绿回归测试。
提交前已做全量检索:全部 13,065 条 Discussion 标题,以及全部 34,700 个 fork 中
packages/subprocess/subprocess-local/src/shell-activity.ts的 blob(其中 9 月 15 日之后有推送的 12,422 个 fork 逐个比对)——没有任何 fork 修改过这一行;上游master与dsh-v0.2.2-rc.3仍是PS0+=。仓库未开放 Issue/PR,因此以 Discussion 形式提交补丁分支。All reactions