How can I make a script that opens terminal windows and executes commands in them?

  • I have three scripts I need to run when I start up my Ubuntu machine, they start services I use in my development environment.

    To do that, I manually open three terminals and type in the commands.

    Is there any way to create a script that will open three terminals and execute one command in each of these? (Each command should be in a separate terminal window so I can see their output).

  • gnome-terminal -e command

    or

    xterm -e command

    or

    konsole -e command

    Pretty much

    terminal -e command

    To make the terminal stay when the command exits:

    In konsole there is a --noclose flag.

    In xterm, there is a -hold flag.

    In gnome-terminal, go to Edit -> Profile Preferences -> Title. Click the Command tab. Select Hold the terminal from the drop-down menu labelled When command exits. You should create a new profile for that and execute with

    gnome-terminal --window-with-profile=NAMEOFTHEPROFILE -e command

    If I try to hold the terminal, I get "child process exited normally with status code 127"

    gnome-terminal does not have the title option any more :(

    @törzsmókus It works in Ubuntu 14.04 with gnome-terminal 3.6.2. What distro and version of gnome-terminal are you using?

    16.04 LTS, gnome-terminal 3.18.3. @bhass1 it is 2017…

    @törzsmókus it is 2017 indeed! LTS releases have a 5 year support life. 14.04 does not end until April 2019. https://wiki.ubuntu.com/Releases

    `gnome-terminal -e command` only works if `command` is quoted. So this does not work: `gnome-terminal -e "echo hello world; sleep 3"` but this does: `gnome-terminal -e "bash -c 'echo hello world; sleep 3'"`. Sigh.

    consider using now: `gnome-terminal -- command `

    how to find default app variables or wrappers so that command would be running in any distro terminal apps? How to find also default browser or text editor variable?

    I get this warning: `Option “-e” is deprecated and might be removed in a later version of gnome-terminal.` better to use `--` instead of `-e` like the example in @dallonsi comment

  • Instead of hard-coding gnome-terminal, konsole, et cetera, use the Alternatives system. The program that executes the default terminal emulator is:

    x-terminal-emulator
    

    On my system, it opens a new instance of Konsole every time I execute this command.

    Luckily, the terminals seems to support the -e option for executing a command (I verified it for konsole and gnome-terminal). Arguments after the command are passed to the invoked command. Bash refuses to stay open in my terminal, an additional script is needed to get a terminal:

    #!/bin/sh
    "[email protected]"
    exec "$SHELL"
    

    If you've saved the previous script as /home/user/hacky and made it executable, you would run your scripts with:

    x-terminal-emulator -e /home/user/hacky your-script optional arguments here
    

    The full path is required and /home/user/hacky has to be executable.

    My previous attempt to run a script in a new terminal window can be found in revision #2, it was before I realised arguments can be passed to x-terminal-emulator.

    In this case, it won't help much as the asker wants to do something that isn't the same for all terminals.

    Attempt #3: this one should keep the terminal open and run the program with optional arguments.

    I used gnome option, however, once I run my script, the main terminal closes !! .. any idea why ?

    @Suda.nese That is by design, when the "terminal" is done executing the script it will quit because there is nothing more to do. You could "fix" this by invoking a shell where you can execute commands (`bash`) or have a line such as `read -p "Press Return to continue"`.

    How can you run more than one command in the terminal? For example `cd xxx && start.sh`. The interpretor sees the && as the second part of the command (which is logical), but if I quote it, then it tries to exec the whole thing as one big argument

    @Richard same here, I want to run multiple commands, but it fails

    On my system, `x-terminal-emulator` opens Terminator, but my default terminal is `xfce4-terminal` in "Preferred Applications". Why?

    @AaronFranke I guess that `x-terminal-emulator` is configured by the `update-alternatives` system configuration while "Preferred Applications" is configured and stored in the user configuration.

  • Quite simply-

    #!/bin/bash
    
    /etc/init.d/ccpd status
    

    This is enough for other commands that do not need to display anything in terminal. But here one has to see the status displayed.
    So, it needs to run in a terminal window

    #!/bin/bash
    
    gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE
    

    The other post intended [] to be a placeholder

    Here "NAMEOFTHEPROFILE" is to be replaced with the name of the profile that "Holds the terminal when the command exits".

    enter image description here

    enter image description here

    @cipricus i believe `[]` was just placeholder

    got it. but i have to make the terminal not to close so fast. i guess that is also in the linked question

    @cipricus have you tried the profile one? Just need to add `--window-with-profile=NAMEOFTHEPROFILE` to what I have given

    that part with the profile is still unclear to me. maybe if you put it very clearly in your answer. but the terminal stands if i follow the advice from the linked answer: "In gnome-terminal, go to Edit->Profile Preferences->Title and Command tab->Select "Hold the terminal" from the drop down box labelled "When command exits. "

    @cipricus I would have to get back home to give better instructions, but the idea is to create a special profile with that option set, and use the name of the special profile in the place above.

    @cipricus if that is enough for you, then that is ok. Profile is nothing more than a group of settings. You can setup the settings ONLY for use in your script, and not have to use it in all terminals. You can see Edit -> Profiles to see all the profiles you have, and you would add one there which was setup as explained in the post you linked

  • UPDATE 17 FEB 2020: this answer is now obsolete.

    Click this link and use this other answer instead: Open Terminal with multiple tabs and execute application.


    Aided by @nickguletskii's answer, and my own comment under his answer, and inspired by @grabantot's upvote of my comment, here's my preferred way to do it, especially when I want the terminal to stay open so I can then manually use it.

    Ex. usage: this is really useful to add to your startup programs so this script will run, open a terminal, create and name a tab in the terminal, and run a command for you. Or, you can just add a symlink to this script to your desktop. I use this type of approach so I can double-click a single icon on my desktop and have it open up a bunch of terminals (with various tabs named according to what work I'm going to do in them) and programs to set up my programming environment, for instance, for daily work.

    Here's a contrived example, which opens up a single tab, titles it "test", then runs the simple command cd /etc; ls inside it. The $SHELL part at the end forces the shell to stay open so you can then see its output and continue using it (I learned this somewhere else on Stack Overflow):

    gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
    

    Here's a more complicated example which opens up 3 separate tabs in the same gnome-terminal. This is exactly the type of thing my desktop shortcut does so I can open up a bunch of programming windows at once:

    gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"
    

    Here's a breakdown of that command above:

    • gnome-terminal = open up a gnome-terminal
    • --tab = open up a unique tab for what comes next
    • --title="tab 1" = title this tab "tab 1"
    • --command="bash -c 'cd /etc; ls; $SHELL'" = run the bash -c 'cd /etc; ls; $SHELL' command, which is a command I just made up as an example; here's what it does:
      • bash -c says it is a bash 'c'ommand
      • cd /etc = 'c'hange 'd'irectory into the "/etc" path
      • ls = 'l'i's't contents of this directory
      • $SHELL = this cryptic tidbit is required to keep the shell open so you can work with it. If you want the shell to open, run your command, then close, simply remove this part. I, however, want the tab to stay open so I can go make programming magic. :)
    • we then start back over at the --tab part to produce tab 2, then again for tab 3. Customize to your heart's content.

    Screenshot:

    enter image description here

    glad I was helpful) I also have scripts that I can just click on and start working on the project. There were two problems with them: lots of terminal windows (had a whole separate screen for them) and windows closing after server crashes for example. That answer solves both of my problems with --tab + $SHELL. Nice

  • commenting for the answer by Lekensteyn. I know this is a old post, but for anyone who finds this useful (as I just did) Instead of making another "hacky script" with just put a function inside the script you are calling

    hacky_function()
    {
    "[email protected]"
    exec "$SHELL"
    }
    

    Call your script with "x-terminal-emulator -e /path/to/script hacky_function optional arguments here"

    Don't forget to put "[email protected]" at the end of the script

  • Use the screen command and -d detach from an existing screen session, and reattach here -m force a new screen session -S create a named session instead of using the default name

    this answer is not clear at all, please care to make more understandable

    @azerafati indeed, screen doesn't open up any terminal window... is not even intended by that awesome package...

License under CC-BY-SA with attribution


Content dated before 6/26/2020 9:53 AM