Skip to content

Instantly share code, notes, and snippets.

@tiye
Created March 3, 2026 14:17
Show Gist options
  • Select an option

  • Save tiye/5802add2b7b6ad07d18dba7c4526716d to your computer and use it in GitHub Desktop.

Select an option

Save tiye/5802add2b7b6ad07d18dba7c4526716d to your computer and use it in GitHub Desktop.
heredoc issue in VSCode

Heredoc 编码/终端干扰排查与修复

现象

  • 在工具终端执行含中文的 heredoc 时,出现输出截断、内容错乱。
  • 执行包含 ! 的命令时,出现 event not found
  • 终端输出偶发混入控制字符,影响长命令可读性。

结论

问题并非 UTF-8 编码本身异常,而是 zsh 历史展开提示符控制序列注入 叠加导致的交互干扰:

  1. BANG_HIST 开启时,! 会触发历史展开,导致命令在进入 heredoc 前即被改写/报错。
  2. 在 zsh 中设置 PROMPT_COMMAND 会注入额外控制序列(该变量本是 bash 语义),可能污染工具终端输出。

关键证据

  • set -o 显示修改前 nobanghist off(即历史展开开启)。
  • ~/.zshrc 存在:
    • export PROMPT_COMMAND='echo -ne "\033];${PWD##*/}\007"; ':"$PROMPT_COMMAND";
  • locale 与 UTF-8 正常(LANG=en_US.UTF-8LC_CTYPE=UTF-8)。
  • 独立 heredoc UTF-8 测试文件可正常写入并识别为 charset=utf-8

已执行修复

  1. 备份 zsh 配置:
    • /Users/jon.chen/.zshrc.bak-20260303-193707
  2. 修改 ~/.zshrc
    • 添加 unsetopt BANG_HIST
    • 移除/清空 PROMPT_COMMAND(保留 precmd 做标题更新)
  3. 新开 zsh 验证:
    • nobanghist on
    • PROMPT_COMMAND=empty

推荐实践

  • 在 zsh 中避免使用 PROMPT_COMMAND,改用 precmd/preexec
  • 在自动化与工具会话中,默认关闭 BANG_HIST
  • 对复杂多行输入优先使用文件写入工具,而不是超长 heredoc。
  • 若全局命令与本地开发版能力不一致(如新子命令),优先使用仓库内二进制做验证。

回滚方式

如需回滚本次 zsh 修复:

cp ~/.zshrc.bak-20260303-193707 ~/.zshrc
source ~/.zshrc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment