在 Bash 中禁用默认的复制和粘贴行为

Opa*_*des 10 osx bash terminal

当我粘贴到我的终端会话中时,shell 会立即执行命令,而无需我按下 Enter 键。

我真的不知道如何禁用这种行为。

我在 MacOS Yosemite 上使用预装的终端。

Sté*_*las 18

使用bash4.4 或更新版本并在支持括号粘贴 a la 的终端中xterm,您可以执行以下操作:

bind 'set enable-bracketed-paste'
Run Code Online (Sandbox Code Playgroud)

(或添加set enable-bracketed-paste到您的~/.inputrc

这将导致在提示符处插入复制粘贴缓冲区,而不是将其中的字符解释为输入(如果该缓冲区包含类似的字符^C^Z您仍然可能遇到问题,并且您的终端模拟器没有将它们过滤掉) .

zsh 自 5.1 版起默认执行此操作。

对于其他外壳或终端,另请参阅:如何保护自己免受这种剪贴板滥用?


I_G*_*ong 6

当您粘贴“换行符”字符时会发生这种情况。例如,如果您要粘贴多行,或者您在不知情的情况下复制了行尾的回车符。AFAIK 没有办法真正禁用这种行为,但有办法减轻它。

最简单的方法是一次只复制一行并错过最后一个字符,然后手动添加它。

或者,正如 the_velour_fog 在下面指出的那样,您也可以将其粘贴到显示非打印字符的编辑器中,然后在没有换行符的情况下重新选择。

对于 GNU/Linux 发行版,有一种或两种变通方法,但不知道这个概念是否可以移植到 MacOS。无论如何,看看这里,看看在 mac 中是否有类似的文件可以更改。不幸的是,我对此表示怀疑。


Pet*_*des 6

在粘贴之前,输入单引号,然后粘贴。control-c 和向上箭头将其编辑为一条巨线。

双引号也有效,以防文本包含单引号但不包含双引号。如果它包含$或其他在双引号内展开的内容也没关系,因为您实际上并没有将引用的巨行作为一个命令运行。


您实际上无法在那里编辑整个内容,因为换行符确实会开始一个延续提示(不是官方术语),而不是制作一个长长的行。

鉴于这 4 行:

echo
ls
foo
bar
Run Code Online (Sandbox Code Playgroud)

按照我的建议粘贴会在您的屏幕上显示:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]
Run Code Online (Sandbox Code Playgroud)

然后您可以按 control-C 和向上箭头。(control-C 会破坏光标所在行上的所有内容,因此如果那里有有用的文本,请先按回车键。)

另一种方法是关闭报价并按回车键,然后向上箭头。

无论如何,在向上箭头之后

$ 'echo
ls
foo
bar
Run Code Online (Sandbox Code Playgroud)

control-a 并删除领先的'. 使用 control-left 和 control-right 快速移动粘贴块(按单词)。或者,如果您的终端设置不支持控制箭头键、alt-b 和 alt-f。


文字换行符实际上将命令分开,这 4 行将分别进入您的命令历史记录。您可能希望将它们更改为;&&。(我不知道这有什么技巧,只需使用键重复向前或向后词即可快速到达那里并手动完成。)