Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

For starting my dev environment I wrote a little script. One part is to open a gnome terminal with several tabs where automatically some commands should be executed. Some of those commands depend on an already executed .bashrc. But when using

gnome-terminal --tab -e "command" --tab --tab

the command is executed before .bashrc was executed. Is there a possibility to make an automated gnome-terminal -e behave like a manually used one? (even commands like "cd /foo/bar" do not work with gnome-terminal -e)

share|improve this question
up vote 29 down vote accepted

Once gnome-terminal has started bash, it's out of the loop as far as command execution is concerned: it only manages the input and output. So you'll need bash's cooperation to run something after ~/.bashrc has been loaded.

First, in many cases, you don't actually need to execute commands after ~/.bashrc. For example, opening a terminal in a particular directory can simply be done with cd /foo/bar && gnome-terminal. You can set environment variables in a similar way: VAR=value gnome-terminal. (If your ~/.bashrc overrides environment variables, you're doing it wrong: environment variable definitions belong in ~/.profile)

To execute commands in the terminal, but before ~/.bashrc, you can do

gnome-terminal -x sh -c 'command1; command2; exec bash'

If you want to use multiple tabs, you have to use -e instead of -x. Gnome-terminal unhelpfully splits the argument of -e at spaces rather than executing it through a shell. Nonetheless, you can write a shell command if you make sure not to include spaces in it. At least with gnome-terminal 2.26, you can use tabs, though (replace <TAB> by a literal tab character):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

If you do need to run commands after ~/.bashrc, make it run the commands. For example, include the following code at the end of ~/.bashrc:

eval "$BASH_POST_RC"

Then to run a some code after (really, at the end of) your bashrc:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

or (less heavy on the quoting)

BASH_POST_RC='command1; command2' gnome-terminal

Although I don't particularly recommend doing it this way, you may be interested in the techniques mentioned in How to start a terminal with certain text already input on the command-line?.

share|improve this answer
+1: Nice trick! – cYrus Oct 10 '10 at 22:44
Yes, indeed a nice trick. Never thought of that. Now I must find a way to set the BASH_POST_RC variable differently for the specific tab. And that still seems to be a problem. A simple "gnome-terminal --tab -e 'BASH_POST_RC=ls' --tab" is not possible :-( – Zardoz Oct 10 '10 at 23:41
@Zardoz: Actually, you can trick gnome-terminal using tab characters (see my revised answer). Mind the multiple levels of quoting. – Gilles Oct 11 '10 at 0:11
.. it works :-) ... thanks a lot for your solution and your patience. Here my complete command (works even with those spaces in the commands: gnome-terminal --working-directory="/home/zardoz/projects/my_rails_app" --tab -e 'bash -c "export BASH_POST_RC=\"rails server\"; exec bash"' --tab -e 'bash -c "export BASH_POST_RC=\"autotest\"; exec bash"' --tab – Zardoz Oct 11 '10 at 0:44
@terdon No, gnome-terminal -e does not invoke a shell at all. If you run gnome-terminal -e 'sleep 9', that executes the command sleep with the argument 9, and no shell is involved. If you execute gnome-terminal -e 'sleep 9;bash' then the terminal opens and closes immediately, because sleep complains that 9;bash is not a valid time interval. You can observe what's going on with strace -f -eexecve gnome-terminal -e … – Gilles Feb 4 at 12:46

When you use the -e option the gnome-terminal will run that command without starting a new shell (you can even run something like: gnome-terminal -e gedit), so if you want to run a command into the bash shell into a new terminal/tab you have to do something like this:

gnome-terminal -x bash -c "command"

But note that when "command" ends the terminal/tab will end too.

share|improve this answer
I think you mean gnome-terminal -x bash -c "command" (-e expects a single argument). And it's fairly simple to execute a shell after command, at least as long as you're starting a single tab — see my answer. – Gilles Oct 10 '10 at 22:40
gnome-terminal -x "bash" -c "command" worked for me. Note quotes on -x arg value. – erm3nda Jul 29 '15 at 21:30

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.