复制粘贴后为什么会出现 ^[[200~ … ~

在用终端(Terminal)复制粘贴一段 GitHub 地址时,遇到了一个奇怪的现象:

1
^[[200~https://github.com/microsoft/markitdown.git~

好好的链接前后突然多了 ^[[200~~。这到底是什么?会不会把命令弄坏?本文用最通俗的语言把原因、影响以及避免方法一次讲清。


1 现象还原

步骤 我的操作
在网页上复制了地址 https://github.com/microsoft/markitdown.git
回到终端,先按了 Ctrl+V
发现没反应,又右键选择 Paste
终端里出现 ^[[200~https://github.com/microsoft/markitdown.git~

2 罪魁祸首:终端的“括号粘贴模式”

现代终端(Linux 的 gnome-terminal、macOS 的 iTerm2、Windows 的 Windows Terminal、VS Code 的内置终端等)都支持一项叫 Bracketed Paste(括号粘贴) 的功能。

  • 目的:让 shell 或编辑器知道“这是一整块粘贴”,防止粘贴内容被意外解释成命令。
  • 做法:在真正文本前后插入两串看不见的转义字符
    • 开头:ESC[200~(终端里显示成 ^[[200~
    • 结尾:ESC[201~(有时只显示成单独的 ~

所以:

1
^[[200~https://github.com/microsoft/markitdown.git~

其实就是:

1
ESC[200~ 真正内容 ESC[201~

3 触发条件

  1. 你先按了 Ctrl+V
    在很多终端里,Ctrl+V 不是“粘贴”,而是告诉终端“我要开始一次带括号的粘贴”。
  2. 紧接着又点了右键 → Paste
    终端收到两次“粘贴”信号,于是把转义字符也一起输出了。

4 如何避免

目标 正确姿势
只想粘贴 **别按 Ctrl+V**,直接右键 Paste 即可
想彻底关闭该功能 在对应 shell 里执行一条命令:
Bash/Zshbind 'set enable-bracketed-paste off'
Fishset -g fish_paste_bracketed off
已经粘进来了 手动删掉 ^[[200~ 和末尾的 ~,再回车即可,不会影响命令本身

5 一句话总结

终端为了“安全粘贴”自动加了 ^[[200~ … ~不是链接坏了,删掉即可;下次直接右键 Paste,别再按 Ctrl+V,就能彻底告别这串奇怪字符。