37

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)

50

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?.

9
  • 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. 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
  • Finally made it work... After sooo many tests with quotes all the way round. Here is mine, using zsh and opening a server and a console at once: gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"' Nov 26 '13 at 11:51
  • 2
    @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 … Feb 4 '16 at 12:46
6

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.

5
  • 1
    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. Oct 10 '10 at 22:40
  • gnome-terminal -x "bash" -c "command" worked for me. Note quotes on -x arg value.
    – m3nda
    Jul 29 '15 at 21:30
  • I get # Option “-x” is deprecated and might be removed in a later version of gnome-terminal. `
    – MrCholo
    Dec 15 '18 at 0:38
  • 1
    please, what do we do since the -x and -e optons are deprecated???
    – nyxee
    Mar 9 '19 at 11:37
  • I believe that this doesn't run ~/.bashrc before executing the command, as originally asked by the OP.
    – IgNite
    Nov 20 '19 at 16:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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