粘贴命令时停止终端自动执行

Sta*_*ers 43 command-line

是的,这是一个有点烦人的功能,因为会发生这种情况,而其他时候不会,非常奇怪。

我将命令粘贴到终端中以调整其参数,有时它会在我粘贴它的第二个执行。有时不会。

这范围从尴尬(在 IRC 上发布无意义的评论)到危险。

如何永久关闭此功能?当我粘贴到终端时,我永远,永远,永远不希望终端自动执行。

小智 34

没有自动执行。您可能还在命令之后复制了一个换行符(或更多)。

如果你粘贴一个中断的命令,shell(命令行)认为你是自己按下了中断(回车,回车)按钮。


这个答案仅解释了为什么 OP 会出现不良行为。但是,在另一个答案中, OP 的问题有一个真正的解决方案

  • 是的,但问题是如果可能的话如何阻止它:) (10认同)
  • 至少对 Putty 的修复 http://serverfault.com/questions/731022/prevent-accidental-execution-of-commands-in-linux-if-pasting-text- contains-one (2认同)

小智 20

一种真正的解决方案是打开编辑模式,ctrl-x ctrl-e然后安全地将剪贴板粘贴到您选择的编辑器(通常是 emacs 或 vim)中。完成命令编辑后,保存并退出,它将在命令行中运行。对于较长或复杂的命令,这是一个好习惯,尤其是在将提交哈希粘贴到 git 命令中时,从长远来看,可以帮助您避免一些可怕的结果。

可以通过设置 VISUAL 和 EDITOR 变量来更改编辑器(它们具有不同的含义,请参见此处)。


小智 10

正如其他人所提到的,当粘贴的文本包含换行符时会出现问题。有了这些知识,您的问题或多或少与Server Fault 上的问题相同。不同的网站,所以我会在这里重复我的答案......

您想要的是“带括号的粘贴”,该功能在某些 shell 中可用。

假设您使用的是最新版本的 bash shell,您可以为当前会话打开它,如下所示:

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

现在通过粘贴多行来尝试一下:

echo Hello world
echo Again, I say, hello!
Run Code Online (Sandbox Code Playgroud)

Shell 识别出文本已粘贴(未键入),并等待您的确认提示。如果一切看起来都可以安全进行,请按 Enter 键。如果没有,请按 Control-C 取消。

如果您想为每个新会话启用带括号的粘贴,请将命令添加到您的 .inputrc 文件中:

cd ~
echo "set enable-bracketed-paste" >> .inputrc
Run Code Online (Sandbox Code Playgroud)

另一种选择是从bash切换到zsh,默认情况下启用括号粘贴。用 zsh shell 替换当前的 shell:

exec zsh
Run Code Online (Sandbox Code Playgroud)

使用 zsh,粘贴的文本会突出显示,这很好。再次,按 Enter 执行命令或按 Control-C 取消。

如果您喜欢 zsh,并希望将其设为默认 shell:

chsh -s /bin/zsh
Run Code Online (Sandbox Code Playgroud)


小智 7

在粘贴之前键入 # 然后粘贴您的行。它不会执行,您可以删除 # 并在修改完成后按 Enter。

  • 这将*只停止第一行*执行。如果 OP 粘贴的文本至少有两个换行符,它们又会被搞砸。 (7认同)