2

I want to write a script to activate a virtual environment and run my server for Django project in a new terminal. My startProject.sh is:

#!/bin/bash
source virtualenv/bin/activate
python manage.py runserver

And, I can run this script on my current terminal by:

source startProject.sh

I want to do this in a new terminal opened by a script.

#!/bin/bash
gnome-terminal --working-directory=/home/myname/project -x 'source startProject.sh'

I tried this too.

#!/bin/bash
gnome-terminal --working-directory=/home/myname/project -x '#!/bin/bash\n source startProject.sh'

Both do not work. Why? I read other questions but I still did not get it. I am a beginner, so please assume no experience.

  • Maybe try gnome-terminal --working-directory=/home/myname/project -x './startProject.sh' – wjandrea Oct 22 '17 at 19:49
  • 1
    @wjandrea, according to this previous question of Heuyie it should be ...'source startProject.sh'. – pa4080 Oct 22 '17 at 21:14
1

According to my experience the command should be:

gnome-terminal --working-directory='/home/<user>/project' -x bash -c "source startProject.sh; exec bash"

Notes:

  • The path of --working-directory='/home/<user>/project' is enclosed with single quote marks in case it contains some special characters as spaces, etc.

  • The option -x means: execute - the remainder of the command line inside the terminal.

  • And our command is bash -c "<commands>". That means we execute a new bash shell, which should run some -c "<commands>".

  • We have two separated (by semicolon ; == new line) <commands>.

  • The first command source startProject.sh will source the script file.

  • The second command exec bash has a meaning - remain open the current gnome-terminal window. There are another possible approaches to do that. In the current case the command exec will replace the current process image with a new process image - in other words it will 'kill' the current process and will execute a new (bash) under the current PID.

Further reading:

  • It worked! Thank you for explaining one by one! :) – Heuyie Oct 23 '17 at 19:07
  • Happy to help, @Heuyie! :) – pa4080 Oct 23 '17 at 19:11
  • One more question. Is gnome-terminal bash or dash command? Why do not I need to specify a shell to run this command? – Heuyie Oct 23 '17 at 23:40
  • @Heuyie: In the above solutions we specify a shell, because: (1) source is Shell Builtin Command (find 'source' in the section Bash Builtin Commands), and in other case gnome-terminal will do something wrong; (2) We want to execute a second command to remain the window open. – pa4080 Oct 24 '17 at 17:46
  • gnome-terminal is a program, executable file that is located within a directory listed in your $PATH envvar, so it is accesible as shell command. See also: How do I modify my $PATH? – pa4080 Oct 24 '17 at 17:47

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.