How to paste multiple Bash commands into a shell without losing some?

6

0

It's nice to copy-paste a series of Bash commands that you find on a website. But depending on the commands, sometimes you lose a few. Maybe they get swallowed up by programs that read from standard input, or perhaps there's another explanation.

So I end up doing this sometimes:

$ bash <<EOF
cmd2
...
EOF

Is there a better way? Some Bash option? An SSH option? (My setup is an Bash running on an Ubuntu server, which I'm SSH'ed to from a standard OS X terminal. Not sure how much of that is relevant.)

EDIT

Example

In response to requests for a concrete example, here's one. I pasted the following four lines into an SSH shell (from my Snow Leopard desktop) connected to a stock Ubuntu Quantal running on an OpenStack VM, in the Bash shell.

sudo apt-get install -y r-base gdebi-core
sudo apt-get install -y libapparmor1 # Required only for Ubuntu, not Debian
wget http://download2.rstudio.org/rstudio-server-0.97.314-amd64.deb
sudo gdebi rstudio-server-0.97.314-amd64.deb

The first two commands executed (successfully), while the last two were apparently never received by the server (or at least, never processed by Bash).

Steve Bennett

Posted 2013-05-13T01:50:53.860

Reputation: 1 458

http://stackoverflow.com/questions/10591591/linux-paste-commands-into-terminal-and-have-them-run-one-after-the-other – Ciro Santilli 新疆改造中心法轮功六四事件 – 2015-08-25T07:57:44.603

1Do you have a specific example of what fails? – slhck – 2013-05-13T06:57:19.883

No. Usually a long-running command, like apt-get update, git clone, wget etc. – Steve Bennett – 2013-05-13T08:00:44.500

Without a concrete problem description it's going to be hard to diagnose what the real issue is. I have yet to see Bash "losing" commands out of nowhere. (I also run OS X and work a lot on remote Linux machines.) – slhck – 2013-05-13T08:03:09.227

1Problem: need a convenient, robust mechanism for pasting a series of commands into a shell then executing them, that doesn't rely on the vagaries of the terminal itself. – Steve Bennett – 2013-05-13T08:05:13.300

What I meant by a concrete problem description was, for example, "I have this snippet I copy and paste, and this is what gets executed, while this is what is lost". Do you usually lose all commands after a certain one, or just some in between, etc? – slhck – 2013-05-13T08:16:33.533

you could always paste the commands into a new txt file and then execute as a script? – James – 2013-05-13T08:17:38.653

slhck: I know what you're asking for. I don't have it, and I don't think it's necessary. – Steve Bennett – 2013-05-13T08:25:15.210

James: yes, but that's even clumsier than the method I originally posted. – Steve Bennett – 2013-05-13T08:25:35.413

1

OT here, but interesting nevertheless. At least I was really surprised, that you sometimes don't get what you expect with copy&paste from websites: http://www.h-online.com/open/news/item/Old-tricks-are-new-again-Dangerous-copy-paste-1842898.html

– mpy – 2013-05-13T16:50:46.750

2This reads like game of "Find me a rock"("No, that one's too big."; "No, that one's too small."; "Not that one, I don't like the color.") A more explicit problem description might get you fewer guesses and some more relevant answers you'd like better. – JRobert – 2013-05-13T17:32:51.000

@JRobert: it's more like "Find me a blue rock that weighs about the same as a cat", "No, that one is red.", "No, that weighs much more than a cat". Maybe it's a hard game, and maybe the rules aren't totally clear, but those guesses are clearly wrong. \ Also, you don't have to play :) – Steve Bennett – 2013-05-15T07:13:37.550

Answers

3

A quick and dirty solution is to run this:

bash -c '<paste commands here>'

This works even if the paste contains newline characters. It may fail if the paste contains single quotes. If you're aware of the bash quoting rules, you should be able to modify this method for the specific commands that you're trying to run.

Kenster

Posted 2013-05-13T01:50:53.860

Reputation: 5 474

That's excellent - I had no idea you could put newlines in command lines. – Steve Bennett – 2013-05-15T07:15:24.667

5

You could also use something like pbpaste | bash. And edit-and-execute-command (\C-x\C-e) also works with multiple commands.

If some commands require root permissions, you can use sudo -v to validate the timestamp for 5 minutes.

Lri

Posted 2013-05-13T01:50:53.860

Reputation: 34 501

xsel on Linux. – Ciro Santilli 新疆改造中心法轮功六四事件 – 2015-08-25T07:58:40.463

@SteveBennett looks like your $VISUAL editor is nano ;) the keystrokes are different for other editors – törzsmókus – 2018-06-29T07:43:01.533

Heh, apparently it was back in 2013. – Steve Bennett – 2018-06-30T13:51:30.403

The OP is SSHing into an Ubuntu server, so pbpasteing into bash is not easily doable there. – slhck – 2013-05-13T08:02:24.113

2Ah, that edit-current-line trick works. (Ctrl-x, Ctrl-E or ^X^E in other notation). – Steve Bennett – 2013-05-13T08:03:08.900

It is quite a few keystrokes all up.: Ctrl+X, Ctrl+E, Cmd-V, Ctrl+X, Y, <enter> – Steve Bennett – 2013-05-13T08:06:44.727

1

I make such cuts and pastes into my favourite text editor, named appropriately, where I can then carefully look for extraneous characters, and ensure that I'll be running what I expect to be running. I'm strongly adverse to cutting and pasting code snippets into an interactive shell: who knows what extra commands might be picked up by the cut & paste operation?

Once your text file has the verified commands saved, they can then be executed with the built-in command

source <filename>

Nevin Williams

Posted 2013-05-13T01:50:53.860

Reputation: 3 725

Ok, and once you've satisfied yourself that the contents of the clipboard is precisely what you want to run? – Steve Bennett – 2013-05-13T08:00:05.463

Original updated; On the saved file, use 'source <filename>' to execute the statements within, without having to make it executable. – Nevin Williams – 2013-05-13T09:41:46.647

And now you have a script file lying around which you'll never run again. That's pretty clumsy. – Steve Bennett – 2013-05-13T09:53:55.067

then you delete it and it won't be around anymore. – ShinTakezou – 2013-05-13T10:06:04.147

1Yep. Way clumsier than the original <<EOF method. – Steve Bennett – 2013-05-15T07:14:24.727