Open gnome terminal programmatically and execute commands after bashrc was executed

35

25

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)

Zardoz

Posted 2010-10-10T22:04:14.780

Reputation: 800

Answers

46

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

Gilles 'SO- stop being evil'

Posted 2010-10-10T22:04:14.780

Reputation: 58 319

Derp, I thought it was failing because the command I ran existed very quickly, be sure to run something more than an echo to test! – ThorSummoner – 2015-08-31T06:41:24.517

@Gilles your answer lead to a little bit of confusion here. To clarify, when you say that "Gnome-terminal unhelpfully splits the argument of -e at spaces rather than executing it through a shell", you mean that it splits the command and then passes it to the shell to execute, instead of passing the whole thing to the shell and letting the shell deal with splitting, right? Not that it somehow bypasses the shell completely. The command given is still being executed via the users default shell, right?

– terdon – 2016-02-04T12:41:26.020

1@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 'SO- stop being evil' – 2016-02-04T12:46:59.833

@terdon More generally, the user's default shell is only invoked to start an interactive shell. It is never invoked to run a command — the shell might not implement a Bourne-style syntax, it might not support a -c argument. “Never” of course excludes buggy programs. – Gilles 'SO- stop being evil' – 2016-02-04T12:49:03.153

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 – 2010-10-10T23:41:02.770

@Zardoz: Actually, you can trick gnome-terminal using tab characters (see my revised answer). Mind the multiple levels of quoting. – Gilles 'SO- stop being evil' – 2010-10-11T00:11:45.390

.. 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 – 2010-10-11T00:44:53.810

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"' – Augustin Riedinger – 2013-11-26T11:51:10.640

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.

cYrus

Posted 2010-10-10T22:04:14.780

Reputation: 18 102

gnome-terminal -x "bash" -c "command" worked for me. Note quotes on -x arg value. – m3nda – 2015-07-29T21:30:12.033

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.

– Gilles 'SO- stop being evil' – 2010-10-10T22:40:01.653

I get # Option “-x” is deprecated and might be removed in a later version of gnome-terminal. ` – MrCholo – 2018-12-15T00:38:55.267

1please, what do we do since the -x and -e optons are deprecated??? – nyxee – 2019-03-09T11:37:38.817

I believe that this doesn't run ~/.bashrc before executing the command, as originally asked by the OP. – IgNite – 2019-11-20T16:14:12.210