终端粘贴^[[200~问题及解决方法

有时候在终端粘贴内容时,会在前面加上 ^[[200~ 这些字符,尤其是在粘贴一大串链接的时候,比较让人难受。那么这是什么原因呢?该怎么处理?今天我们就来好好盘一盘。

原因

在终端中进行粘贴操作时,有时候会遇到一些额外的转义字符,这可能和终端的某种模式有关。

例如,某些终端模拟器支持“括号粘贴模式”(Bracketed Paste Mode),这种模式允许终端区分用户直接输入的文本和从剪贴板粘贴的文本

当启用这个模式时,粘贴的内容会被特定的转义字符包围,比如开始标记和结束标记,以便应用程序(如 Shell 或编辑器)区分用户直接输入和粘贴内容,从而避免意外执行恶意代码或格式混乱。

默认情况下,在 bash 中会启用括号粘贴(bracketed paste)。 bash readline 库版本 8.1 现已正式发布,它会默认启用括号粘贴模式。当您将文本粘贴到终端时(即使以换行符结尾),bash 会突出显示文本,您必须按 Enter 键来执行粘贴命令。括号粘贴模式是默认设置,它可以避免意外执行恶意命令。

括号遵循“特殊键”转义字符的通常格式(ESC [ <num> ~^[ 代表 ESC 字符),与 PgUp/PgDn 键或 F4F12 功能键相同。因此从 Shell 或编辑器的角度来看,它们也被视为键绑定。如 Bash 中可以使用 bind 命令查看:

1
2
3
$ bind -p | grep 200
"\M-[200~": bracketed-paste-begin
"\200": self-insert

与所有其他转转义字符一样,如果您在粘贴之前(或在按下特殊键之前)意外按下了 Ctrl+V,则会导致 Shell 将后面的内容视为文字输入。例如,Ctrl+V 不会滚动浏览历史记录,而是直接插入^[[A

正常 Ctrl+V 不是粘贴。粘贴是 Shift+Insert,复制是 Shift+Insert。终端模拟器 Ctrl+V 能粘贴其实是被覆盖了。

此外,括号粘贴模式是通过程序向终端打印转义序列来启用的。因此,如果使用该模式的程序意外退出,则可能启用该模式。

解决

以下内容由 DeepSeek-R1 生成:

临时禁用括号粘贴模式

在粘贴前,手动关闭该模式(适用于当前会话):

1
printf '\e[?2004l'  # 关闭括号粘贴模式

粘贴内容后,重新启用(如果需要):

1
printf '\e[?2004h'  # 重新启用

永久禁用

在 Shell 配置文件(如 ~/.bashrc~/.zshrc)中加入:

1
bind 'set enable-bracketed-paste off'  # Bash

1
unset zle_bracketed_paste  # Zsh

检查终端模拟器设置

某些终端(如 GNOME Terminal、iTerm2)支持直接关闭括号粘贴模式。进入设置,搜索类似 “Bracketed Paste” 的选项并禁用。

配置应用程序支持括号粘贴

如果问题出现在编辑器(如 Vim),确保其版本较新(≥ 8.0),或添加配置:

1
2
3
4
if !has('patch-8.0.0238')
let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
endif

使用快捷键粘贴(替代右键)

部分终端支持 Ctrl+Shift+VCmd+V 直接粘贴原始内容,绕过模式干扰。

参考

https://superuser.com/questions/1532688/pasting-required-text-into-terminal-emulator-results-in-200required-text

https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/9/html/9.0_release_notes/enhancement_shells-and-command-line-tools