为什么有时当我在 bash 提示符上粘贴命令时,即使我不按 Enter 键,它也会被执行?

问题描述 投票:0回答:4

无需按 Enter 键即可执行命令。 有时这可能很危险...

这是为什么?我该如何预防?

bash copy-paste
4个回答
12
投票

因为你用它粘贴了新行字符。它有时很有用,例如,您可以一次复制/粘贴许多命令(长的多行脚本)。

嗯,我从来没有想过要阻止这种特殊的行为。这是正常的,也是意料之中的。 WYPIWYG - 你粘贴什么,你就得到什么。


12
投票

您正在粘贴一个或多个换行符。除了简单地不复制和粘贴换行符之外,您还可以采取一些措施来解决此问题:

  • 对于单行命令,先输入“#”,这样该命令就会被注释掉。然后您可以返回并编辑它。

  • 使用bash(看似鲜为人知)的编辑和执行命令功能。要调用它,如果您使用 emacs 键绑定(默认),则可以按

    CTRL-x
    CTRL-e
    ;如果使用 vi 键绑定,则可以按
    ESC v
    。这将调用包含当前命令行的文本编辑器。然后您可以粘贴到编辑器中并编辑命令。保存并退出后,将执行编辑器保存的命令(如果您想中止注释掉所有行或完全清除缓冲区)。您可以通过
    FCEDIT
    EDITOR
    环境变量设置使用哪个编辑器。


3
投票

阻止执行的快速方法是键入注释字符 #,然后粘贴命令。

我经常这样做,因为我在复制时手脚粗,抓住了无关的字符。

当您在注释字符后粘贴时,该命令位于历史缓冲区中,您可以编辑它、取消注释并运行它。

---回复评论

你是对的,这只适用于单行命令。如果剪贴板中有多行,则可以通过 sed 管道传输剪贴板数据。

愚蠢的bash技巧#400万零一:

prompt:$ xclip -o -selection clipboard | sed --regexp-extended 's/^(.*)$/# \1;/'

将转动这个:

for i in *.JPG;

do echo mv $i ${i/.JPG/.jpg};

done;

进入这个:

# for i in *.JPG;

# do echo mv $i ${i/.JPG/.jpg};

# done;

这确实不值得付出努力,但有点有趣;>


0
投票

这是为什么?我该如何预防?

“为什么”部分已经在其他答案中涵盖了。然而,bash 有一个预防机制,尽管在 other 堆栈交换 sites 上有所介绍,但此处发布的答案中并未涵盖该机制。 您可能正在寻找:

bind 'set enable-bracketed-paste on'

这样,粘贴(而不是打字)将被检测到,并且整个文本将在提示符上立即输入,包括换行符,让您有机会在执行命令之前对其进行编辑。这与 zsh 和其他 shell 使用的默认值类似。

它是(GNU)

readline

(≥7.0)的一个功能,bash和其他一些交互式shell(python等)使用的库来提供用户友好的交互式提示。也可以将其设置为每个 readline 程序的默认值:

echo "set enable-bracketed-paste on" >> ~/.inputrc

来自手册(
man 3 readline

):

enable-bracketed-paste (On)
              When set to On, readline configures the terminal to insert
              each paste into the editing buffer as a single string of
              characters, instead of treating each character as if it
              had been read from the keyboard.  This prevents readline
              from executing any editing commands bound to key sequences
              appearing in the pasted text.

© www.soinside.com 2019 - 2024. All rights reserved.