7

Sometimes if text that is on the clipboard is pasted into shell and it contains a return character it will execute even though that wasn't the intention. Sometimes even multiple lines may be pasted in by mistake and then unintended commands could be run.

I understand in a perfect world, these mistakes would never happen, but is there a way to prevent this to avoid the risk of human error?

4 Answers 4

7

What you want is called 'bracketed paste', a feature that's available in some shells.

If your version of bash supports it, you can turn it on for the current session like so:

bind 'set enable-bracketed-paste on'

Now try it out by pasting multiple lines:

echo Hello world
echo Again, I say, hello!

The shell recognises that the text was pasted (not typed), and waits with a prompt for your confirmation. If it all looks safe to proceed, hit the Enter key. If not, hit Control-C to cancel.

If you'd like to enable bracketed paste for every new session, add the command to your .inputrc file:

cd ~
echo "set enable-bracketed-paste" >> .inputrc

Another option is to switch from bash to zsh, where bracketed paste is enabled by default. To replace your current shell with a zsh shell:

exec zsh

With zsh, pasted text gets highlighted, which is nice. Again, hit Enter to execute the command/s or Control-C to cancel.

If you like zsh, and wish to make it the default shell:

chsh -s /bin/zsh
2
  • for me bind -v | grep enable-bracketed-paste errors out on a login shell. Only after running bash in bash and testing the command again I would get a result. I felt into the pitfall of Apple's ancient /bin/bash whereas bash would open the recent /usr/local/bin/bash I installed with Homebrew, so watch out! Jan 24 at 14:35
  • Great! I wanted to opposite: when pasting newline, run command immediately. echo "bind 'set enable-bracketed-paste off'" >> ~/.bash_aliases did the trick. Thanks!
    – awvalenti
    Mar 5 at 14:31
3

If you're using PuTTY on Windows, here's an AutoHotKey script which will detect if you're trying to paste something into PuTTY that has one or more newlines and if so will confirm you're wanting to do so.

Tip: you can hit the space bar or keypad enter key as an easy way to press "Yes".

Note: this script uses ctrl+v to paste into PuTTY, but you could replace ^v with RButton if you wanted to hook this into the right-click-to-paste default functionality of PuTTY.

#ifwinactive ahk_class PuTTY

    ^v::

        var := clipboard
        var := RegExReplace(var, "\r\n?|\n\r?", "`n", lineNum)

        If(lineNum>0)
        {
            MsgBox, 4, , There are one or more newlines in what you're pasting, are you sure you want to continue?
            IfMsgBox Yes
                SendInput {Shift down}{Insert}{Shift Up}
            else IfMsgBox No
                return
        }
        else
        {
            SendInput {Shift down}{Insert}{Shift Up}
        }

    return

#ifwinactive
3

Use Ctrl+X Ctrl+E (“edit current line”) before pasting. This will start your default editor; you have to save and quit, then the pasted commands are executed.

-1

I had the same problem, but then I made a habit of always copying a single word into clipboard, after I'm done pasting. If you force this habit 3-4 times then your hands will do it automatically from there on. I have never mis-pasted since I began this routine.

1
  • this question is not about mis-pasting something unintended, but pasting something intended with an unintended return (linefeed, enter) Jul 2, 2018 at 11:03

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .