66

I created a bash script that opens several gnome-terminals, connect to classroom computers via ssh and run a script.

How can I avoid that the gnome-terminal closes after the script is finished? Note that I also want to be able to enter further commands in the terminal.

Here is an example of my code:

gnome-terminal -e "ssh root@<ip> cd /tmp && ls"
Lesmana
  • 24,114
  • 8
  • 78
  • 84
Marten Bauer
  • 2,945
  • 5
  • 21
  • 18
  • possible duplicate of [Prevent Gnome Terminal From Exiting After Execution](http://stackoverflow.com/questions/4465930/prevent-gnome-terminal-from-exiting-after-execution) – givanse Feb 04 '14 at 19:05
  • Also: http://askubuntu.com/q/3359/6506 – givanse Feb 04 '14 at 19:05

10 Answers10

94

As I understand you want gnome-terminal to open, have it execute some commands, and then drop to the prompt so you can enter some more commands. Gnome-terminal is not designed for this use case, but there are workarounds:

Let gnome-terminal run bash and tell bash to run your commands and then run bash

$ gnome-terminal -e "bash -c \"echo foo; echo bar; exec bash\""

The exec bash at the end is necessary because bash -c will terminate once the commands are done. exec causes the running process to be replaced by the new process, otherwise you will have two bash processes running.

Let gnome-terminal run bash with a prepared rcfile which runs your commands

Prepare somercfile:

source ~/.bashrc
echo foo
echo bar

Then run:

$ gnome-terminal -e "bash --rcfile somercfile"

Let gnome-terminal run a script which runs your commands and then drops to bash

Prepare scripttobash:

#!/bin/sh
echo foo
echo bar
exec bash

Set this file as executable.

Then run:

$ gnome-terminal -e "./scripttobash"

Alternatively you can make a genericscripttobash:

#!/bin/sh
for command in "$@"; do
  $command
done
exec bash

Then run:

$ gnome-terminal -e "./genericscripttobash \"echo foo\" \"echo bar\""

Every method has it's quirks. You must choose, but choose wisely. I like the first solution for its verbosity and the straightforwardness.

All that said, this might be of good use for you: http://www.linux.com/archive/feature/151340

David Rivers
  • 2,842
  • 1
  • 30
  • 39
Lesmana
  • 24,114
  • 8
  • 78
  • 84
  • It might be worth noting that the `rcfile` solution allows commands to be run _after_ the ` .bashrc` file is sourced, while none of the other options allow you to do that. – M. Andres Oct 29 '16 at 15:36
  • Although this is crazy after the fact I am glad I stumbled across this post. I have a script which used the "Hold" method in the profile, and idiots keep clicking the relaunch button that pops up and causing issues! – Kip K Feb 10 '17 at 14:04
15

Finally this one works for me:

gnome-terminal --working-directory=WORK_DIR -x bash -c "COMMAND; bash"
Lukasz Frankowski
  • 2,687
  • 1
  • 28
  • 30
11
  • Stack Overflow answer: the terminal closes when the command run inside it has finished, so you need to write a command that doesn't terminate immediately. For example, to leave the terminal window open until you press Enter in it:

    gnome-terminal -e "ssh host 'cd /tmp && ls'; read line"
    
  • Super User answer: Create a profile in which the preference “Title and Command/When command exits” is set to “Hold the terminal open”. Invoke gnome-terminal with the --window-with-profile or --tab-with-profile option to specify the terminal name.

Community
  • 1
  • 1
Gilles 'SO- stop being evil'
  • 98,216
  • 36
  • 202
  • 244
  • 1
    This idea helps but doesn't do what I want. I will do some commands in the terminal automatically as described above. After the execution I will be able to enter some commands by hand. In the past I did by hand (copy/paste): 1. ssh root@ 2. cd /root/install && ./WriteImage.sh && InitImage.py 3. The line 2. I copied by hand to 20 terminals for 20 computers. Can't I do step 1. and 2. automatically and also be able to enter other commands by hand as in step 3.? – Marten Bauer Aug 19 '10 at 08:24
  • 1
    The problem with `--window-with-profile' (which opens separate terminals) or `--tab-with-profile` (which opens tabs in a single terminal) is that once the script finishes running in the tab/window, or when I press `Ctrl+c`, the tab/window closes immediately. I don't want it to close. I want the tab to remain open and to show the bash prompt so that I can continue typing commands in the bash prompt of that tab. Isn't that possible in any way? `read line` only pauses for a user input, and that is not what I'm looking for. Any help would be appreciated. – Nav Oct 06 '15 at 03:19
  • 1
    @Nav That's a different question: you want to leave the *shell* open, not the terminal. I'm sure it's been asked before, possibly on [su] or [unix.se] rather than [so] since it isn't a programming problem (but probably on [so] too anyway). – Gilles 'SO- stop being evil' Oct 06 '15 at 09:56
5

Run with -ic instead -i to make terminal close bash proccess when you close your terminal gui:

gnome-terminal -e "bash -ic \"echo foo; echo bar; exec bash\""
Zini
  • 912
  • 7
  • 15
3

The ideal solution would be to ask for a user input with echo "Press any key".

But if double-click in Nautis or Nemo and select run in a terminal, it doesn't seem to work.

In case of Ubuntu a shell designed for fast start-up and execution with only standard features is used, named dash I believe. Because of this the shebang is the very first line to start with to enable proper use of bash features. Normally this would be: #!/bin/bash or similar. In Ubuntu I learned this should be: #!/usr/bin/env bash.

Many workarounds exist to keep hold of the screen before the interpreter sees a syntax error in a bash command.

The solution in Ubuntu that worked for me:

#!/usr/bin/env bash

your code

echo Press a key...
read -n1
Leo
  • 168
  • 1
  • 8
3

As of January 2020, the -e option in gnome-terminal still runs properly but throws out the following warning:

For -e:

# Option “-e” is deprecated and might be removed in a later version of gnome-terminal.

# Use “-- ” to terminate the options and put the command line to execute after it.

Based on that information above, I confirmed that you can run the following two commands without receiving any warning messages:

$ gnome-terminal -- "./scripttobash"
$ gnome-terminal -- "./genericscripttobash \"echo foo\" \"echo bar\""

I hope this helps anyone else presently having this issue :)

Member2017
  • 401
  • 2
  • 8
  • 16
0

For a solution applicable to any terminal, there is a script that opens a terminal, runs the command specified and gives you back the prompt in that new terminal:

https://stackoverflow.com/a/60732147/1272994

philipper
  • 325
  • 3
  • 8
0

I really like the bash --rcfile method

I just source ~/.bashrc then add the commands I want to the new startrc.sh

now my automated start.sh work environment is complete... for now

Liz
  • 1
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Oct 17 '21 at 07:17
-3

If running a bash script just add gedit afile to the end of the script and that will hold gnome-terminal open. "afile" could be a build log which it was in my case.

Did not try just using gedit alone but, that would properly work too.

NickyP
  • 91
  • 1
  • 7
-5

Use nohup command.

nohup gnome-terminal -e "ssh root@ cd /tmp && ls"

Hope this will help you.

sourcerebels
  • 5,082
  • 1
  • 31
  • 52