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


9

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

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

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


9
当然,只有粘贴缓冲区包含换行符时,它才会这样做。这几乎与bash无关。(它仅在使用readline库时才涉及bash。)
彼得-恢复莫妮卡

...并且bash(在的帮助下readline)已解决。
亚历克西斯

Answers:


16

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

bind 'set enable-bracketed-paste'

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

这将导致在复制提示时插入复制粘贴缓冲区,而不是像输入时那样解释其中的字符(如果该缓冲区包含诸如之类的字符^C^Z并且终端仿真器未将其过滤掉,您仍然可能会遇到问题) 。

zsh 从5.1版开始,默认情况下不会执行此操作。

对于其他外壳或端子,另请参阅:如何保护自己免受此类剪贴板损坏?


我会直接查看
-Opaldes

展位的方式似乎不起作用
Opaldes

@Opaldes,您尝试了什么?用什么版本的外壳和什么端子?我相信OS / X也会随附xterm,您可以尝试使用它。您是否perl在链接的问题上尝试过脚本?
斯特凡Chazelas

1
@Opaldes,根据在Mac OS X上将代码粘贴到终端窗口到vim中的说明,自OS / X Lion以来,OS / X Terminal支持带括号的粘贴。因此,您似乎需要的只是最新版本的zsh或bash。对于较旧的zsh版本,也可以通过配置来实现。
斯特凡Chazelas

1
:我们可以感谢丹尼尔Colascione添加到猛砸/ readline这个实用的功能gnu-bash.2382.n7.nabble.com/...
安东尼纪勤

6

当您粘贴一个“换行符”字符时,会发生这种情况。例如,如果要粘贴多行,或者无意间在行末复制回车符。AFAIK无法实际禁用此行为,但是可以缓解它。

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

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

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


我只是将其粘贴到显示非打印字符的编辑器中,然后在不使用换行符的情况下进行重新选择
the_velour_fog

很好的建议,已编辑为包含。
I_GNU_it_all_along

很高兴知道这说明它并非始终存在。我支持您的回答,但这是我的一种解决方法。
Opaldes

这很痛苦,但是在复制一系列命令时很有用。
I_GNU_it_all_along

我的“解决方案”也是一种解决方法,但是它比单独选择IMO更快。
彼得·科德斯

5

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

如果文本包含单引号但不包含双引号,则双引号也可以使用。可以包含$双引号内的内容或其他内容,这是可以的,因为您实际上并未将带引号的巨行作为一条命令运行。


您实际上不能在那里编辑整个内容,因为换行符确实会开始一个连续提示(而不是官方术语),而不是形成一个大的长行。

给出以下4行:

echo
ls
foo
bar

按照我的建议粘贴会在屏幕上显示以下内容:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

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

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

无论如何,经过向上箭头

$ 'echo
ls
foo
bar

控制-a并删除前导'。使用向左控制和向右控制可快速移动粘贴块(按单词)。或者,如果您的终端设置不支持控制箭头键,则按alt-b和alt-f。


文字换行符实际上是分开命令的,这4行将分别进入命令历史记录。您可能需要将它们更改为;&&。(我不知道这有什么窍门,只需将key-repeat用于向前或向后的单词即可快速到达并手动完成。)


2

发生这种情况是因为您的粘贴以换行符结尾,并且终端仿真器基本上逐个字符地将粘贴馈送到bash。在此过程中,bash并不真正从机器上认识人类打字员。

我通常在复制粘贴时要格外注意,它不包含换行符,但是您可以尝试以下一种技巧:在粘贴,使用bash之前,键入C-x C-e。它应该$EDITOR以一个空文件启动。无论您保存在该文件中并退出,都会执行bash。因此,您现在可以将命令粘贴到编辑器中,可能进一步进行操作,然后一次性运行它们。


-1

涉及到公司,我是非常满意的客户。尝试以下终端程序:http : //www.emtec.com/zoc/index.html。也有Mac版本可用。

如果我违反此答案的任何SE规则,请告知我,然后删除答案。

编辑:

当我正确理解其他答案时,此问题可能是由终端程序引起的。ZOC终端程序是一款专业软件,专为工作而设计。它将粘贴您选择的文本,而没有任何其他字符。您可以将会话记录在单独的文本文件中。还有更多

更新:

终端程序有一个选项Paste without final 'newline'。可能会有所帮助。


3
请至少说,它是如何解答的问题
斯特凡Chazelas

如果在该终端上运行的shell提示下粘贴包含换行符或回车符的字符串,会发生什么?如果它不能使Shell直接执行命令(如此处所述),它如何执行?它会从选择中删除那些字符吗?它是否在插入b字符之前将其转义为bash?
斯特凡Chazelas

2
因此,它看起来更像是垃圾邮件(尽管我确定这不是您意图对该网站进行垃圾邮件处理)。它不会回答问题,而只是相关商业产品的广告。
斯特凡Chazelas

2
@AlBundy,通过尝试在security.stackexchange.com/q/39118(Stephane的答案中提到)中讨论的漏洞利用以及在那里找到的链接,找出您最喜欢的终端客户端是否解决了此问题。如果它可以保护您,则有充分的理由推荐它(请在答案中提供测试的详细信息。)。
亚历克西斯

通常情况下,问题是,你选择什么确实包含一个换行符。“粘贴选择的文本”与任何其他终端仿真器的正常行为有何不同?
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.