问题描述
我使用 Ubuntu 14.04,我的终端屏幕有一个奇怪的问题,这让我很烦恼。如果我做错了或非 linux-way,有人可以帮助我或解释一下吗?我有某种解决方案,但我想了解为什么这种情况一次又一次发生。
我经常从笔记或互联网上复制 bash 命令,有时我会得到奇怪的 0~ 和 1~ 符号,它们包裹着我复制的东西。这非常烦人,而且这种情况以完全随机的方式发生。
经过长时间的搜索,我发现这个东西叫做 bracked paste mode,所以现在我使用这个命令 printf "\\e[?2004l"
来修复我的终端,如果这个模式突然启用。
是否可以以某种方式永久禁用此功能?我现在工作的所有 Ubuntu 机器上都遇到过这个问题。以前我使用过 Ubuntu 10.10 和 12.04,以前从未遇到过这样的问题。
最佳回答
您可以禁用括号粘贴模式。
要暂时尝试一下,在 bash 中:
bind 'set enable-bracketed-paste off'
然后,如果您喜欢这种行为,您可以将设置放在 ~/.inputrc
中,或 /etc/inputrc
中的 system-wide 中(或 Ubuntu 上的任何位置)。
次佳回答
您可以将该命令放入 bashrc
中。然后它会在您每次打开终端时应用。
只需键入 vi ~/.bashrc
并在末尾添加 printf "\\e[?2004l"
并使用 :wq
保存文件
第三种回答
为了回答您最初提出的为什么会发生这种情况的问题,这里有一个可能的情况:
-
我的家用计算机有一个新版本的 zsh,支持括号粘贴(我们称之为 shell A)
-
我通过 ssh 连接到一台计算机,shell 设置为旧版本的 bash,不支持括号粘贴(shell B)
问题是,我的终端程序仍然认为从 shell A 到 shell B 时启用了括号粘贴,因此它不断在粘贴内容周围添加字符(0~ 和 1~ 位)。 Shell B 不支持它们,因此它只是将它们原封不动地传递出去。您必须通过让您的 shell 打印特殊的转义序列来告诉您的终端关闭括号粘贴 – 这就是 printf "\\e[?2004l"
所做的。
有几种方法可以解决这个问题:
-
如果您根本不关心括号内的粘贴,请在 shell A 上将其关闭,这样它就不会首先启用(@jwd 的答案)
-
如果您想继续在 shell A 上使用括号粘贴,但在 shell B 上禁用,请将转义序列添加到您的
.bashrc
(@MOHRE 的答案) -
升级 shell B 以支持括号粘贴,因此它可以正确解释那些 0~ 和 1~ 字符。
旁注:如果您使用 GNU 屏幕,则需要在屏幕外运行 printf
命令。里面好像不起作用。
第四种回答
我通过将以下内容添加到我的 ~/.bashrc 文件中解决了这个问题:
if [[ $- == *i* ]]; then
bind 'set enable-bracketed-paste off'
fi
这样,当我执行 bash 脚本时,我就不会收到绑定警告。