- 在工具终端执行含中文的 heredoc 时,出现输出截断、内容错乱。
- 执行包含
!的命令时,出现event not found。 - 终端输出偶发混入控制字符,影响长命令可读性。
问题并非 UTF-8 编码本身异常,而是 zsh 历史展开 与 提示符控制序列注入 叠加导致的交互干扰:
BANG_HIST开启时,!会触发历史展开,导致命令在进入 heredoc 前即被改写/报错。- 在 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-8,LC_CTYPE=UTF-8)。- 独立 heredoc UTF-8 测试文件可正常写入并识别为
charset=utf-8。
- 备份 zsh 配置:
/Users/jon.chen/.zshrc.bak-20260303-193707
- 修改
~/.zshrc:- 添加
unsetopt BANG_HIST - 移除/清空
PROMPT_COMMAND(保留precmd做标题更新)
- 添加
- 新开 zsh 验证:
nobanghist onPROMPT_COMMAND=empty
- 在 zsh 中避免使用
PROMPT_COMMAND,改用precmd/preexec。 - 在自动化与工具会话中,默认关闭
BANG_HIST。 - 对复杂多行输入优先使用文件写入工具,而不是超长 heredoc。
- 若全局命令与本地开发版能力不一致(如新子命令),优先使用仓库内二进制做验证。
如需回滚本次 zsh 修复:
cp ~/.zshrc.bak-20260303-193707 ~/.zshrc
source ~/.zshrc