Comment créer un script qui ouvre des fenêtres de terminal et exécute des commandes dans celles-ci?

140

J'ai trois scripts à exécuter lorsque je démarre ma machine Ubuntu. Ils démarrent les services que j'utilise dans mon environnement de développement.

Pour ce faire, j'ouvre manuellement trois terminaux et saisis les commandes.

Est-il possible de créer un script qui ouvrira trois terminaux et exécutera une commande dans chacun d’eux? (Chaque commande doit être dans une fenêtre de terminal distincte pour que je puisse voir leur sortie).

JSBach
la source

Réponses:

138
gnome-terminal -e command

ou

xterm -e command

ou

konsole -e command

Plutôt

terminal -e command

Pour que le terminal reste à la sortie de la commande:

Dans la konsole, il y a un --noclosedrapeau.

Dans xterm, il y a un -holddrapeau.

Dans gnome-terminal, sélectionnez Edition -> Préférences de profil -> Titre . Cliquez sur l' onglet Commande . Sélectionnez Tenir le terminal dans le menu déroulant intitulé Quand la commande quitte . Vous devez créer un nouveau profil pour cela et exécuter avec

gnome-terminal --window-à-profile = NAMEOFTHEPROFILE -e commande
nickguletskii
la source
1
Si j'essaie de tenir le terminal, je reçois un "processus enfant normalement abandonné avec le code d'état 127"
Darshan Chaudhary
2
gnome-terminal n'a plus l'option title. :(
törzsmókus 22/02/2017
1
@ törzsmókus c'est 2017 en effet! Les versions LTS ont une durée de vie de 5 ans. 14.04 ne se termine pas avant avril 2019. wiki.ubuntu.com/Releases
bhass1
1
gnome-terminal -e commandne fonctionne que si commandest cité. Donc , cela ne fonctionne pas: gnome-terminal -e "echo hello world; sleep 3"mais cela ne: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Soupir.
bgoodr
3
Vous pouvez également garder le gnome-terminal ouvert en ajoutant ; $SHELLà la fin de la commande. Ex:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples
58

Au lieu de coder en dur gnome-terminal, konsoleet ainsi de suite, utilisez le système Alternatives. Le programme qui exécute l'émulateur de terminal par défaut est:

x-terminal-emulator

Sur mon système, une nouvelle instance de Konsole est ouverte à chaque fois que j'exécute cette commande.

Heureusement, les terminaux semblent supporter l' -eoption permettant d'exécuter une commande (je l'ai vérifiée pour konsoleet gnome-terminal). Les arguments après la commande sont passés à la commande invoquée. Bash refuse de rester ouvert dans mon terminal, un script supplémentaire est nécessaire pour obtenir un terminal:

#!/bin/sh
"$@"
exec "$SHELL"

Si vous avez enregistré le script précédent /home/user/hackyet l'avez rendu exécutable, vous exécuterez vos scripts avec:

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

Le chemin complet est requis et /home/user/hackydoit être exécutable.

Ma tentative précédente d'exécuter un script dans une nouvelle fenêtre de terminal se trouve dans la révision 2 , c'était avant que je réalise que les arguments peuvent être passés à x-terminal-emulator.

Lekensteyn
la source
Dans ce cas, cela n'aidera pas beaucoup car le demandeur veut faire quelque chose qui n'est pas le même pour tous les terminaux.
nickguletskii
Tentative n ° 3: celui-ci devrait garder le terminal ouvert et exécuter le programme avec des arguments optionnels.
Lekensteyn
1
J'ai utilisé l'option gnome, cependant, une fois le script exécuté, le terminal principal se ferme! .. aucune idée pourquoi?
McLan
3
@ Suda.nese C’est ce qui est voulu, lorsque le "terminal" aura fini d’exécuter le script, il se fermera car il n’y a plus rien à faire. Vous pouvez "résoudre" ceci en appelant un shell où vous pouvez exécuter des commandes ( bash) ou avoir une ligne telle que read -p "Press Return to continue".
Lekensteyn
1
Comment pouvez-vous exécuter plus d'une commande dans le terminal? Par exemple cd xxx && start.sh. L'interprète voit le && comme la deuxième partie de la commande (ce qui est logique), mais si je le cite, il essaie d'exécuter le tout sous la forme d'un argument de poids
Richard
9

Tout simplement-

#!/bin/bash

/etc/init.d/ccpd status

C'est suffisant pour d'autres commandes qui n'ont pas besoin d'afficher quoi que ce soit dans le terminal. Mais ici, il faut voir l'état affiché.
Donc, il doit être exécuté dans une fenêtre de terminal

#!/bin/bash

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

L'autre poste destiné []à être un espace réservé

Ici, "NAMEOFTHEPROFILE" doit être remplacé par le nom du profil "Tient le terminal lorsque la commande est fermée".

entrez la description de l'image ici

entrez la description de l'image ici

Karthik T
la source
1
@cipricus Je crois []était juste un espace réservé
Karthik T
je l'ai. mais je dois faire le terminal ne pas fermer si vite. Je suppose que c'est aussi dans la question liée
@cipricus avez-vous essayé le profil un? Juste besoin d'ajouter --window-with-profile=NAMEOFTHEPROFILEà ce que j'ai donné
Karthik T
1
@cipricus Je devrais rentrer chez moi pour donner de meilleures instructions, mais l'idée est de créer un profil spécial avec cet ensemble d'options et d'utiliser le nom du profil spécial à la place ci-dessus.
Karthik T
2
@cipricus si cela vous suffit, alors c'est bon. Le profil n'est rien d'autre qu'un groupe de paramètres. Vous pouvez configurer les paramètres UNIQUEMENT pour une utilisation dans votre script, sans avoir à l'utiliser dans tous les terminaux. Vous pouvez voir Éditer -> Profils pour voir tous les profils que vous avez, et vous voudriez en ajouter un qui a été configuré comme expliqué dans le message que vous avez lié
Karthik T
5

Avec l' aide de la réponse de @ nickguletskii et de mon propre commentaire, inspiré par le vote favorable de @ grabantot, voici la méthode que je préfère utiliser, en particulier lorsque je souhaite que le terminal reste ouvert afin que je puisse ensuite l'utiliser manuellement.

Ex. usage: c'est vraiment utile d'ajouter à vos programmes de démarrage pour que ce script s'exécute, ouvre un terminal, crée et nomme un onglet dans le terminal et lance une commande pour vous. Ou, vous pouvez simplement ajouter un lien symbolique à ce script sur votre bureau. J'utilise ce type d'approche pour pouvoir double-cliquer sur une seule icône de mon bureau et la laisser ouvrir un tas de terminaux (avec différents onglets nommés en fonction du travail que je vais effectuer) et de programmes à configurer. mon environnement de programmation, par exemple, pour le travail quotidien.

Voici un exemple artificiel, qui ouvre un seul onglet, le titre "test", puis exécute la commande simple cd /etc; lsqu'il contient. La $SHELLpartie à la fin oblige le shell à rester ouvert pour que vous puissiez voir sa sortie et continuer à l'utiliser (j'ai appris cela ailleurs sur Stack Overflow):

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

Voici un exemple plus complexe qui ouvre 3 onglets distincts dans le même terminal gnome. C'est exactement le type de chose que mon raccourci sur le bureau permet de pouvoir ouvrir plusieurs fenêtres de programmation en même temps:

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'"

Voici une ventilation de cette commande ci-dessus:

  • gnome-terminal = ouvrir un gnome-terminal
  • --tab = ouvrir un onglet unique pour ce qui vient ensuite
  • --title="tab 1" = titre cet onglet "onglet 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= lance la bash -c 'cd /etc; ls; $SHELL'commande, qui est une commande que je viens de créer comme exemple; voici ce qu'il fait:
    • bash -c dit que c'est une commande 'bash'
    • cd /etc = 'c'changez' de répertoire dans le chemin "/ etc"
    • ls = Je ne suis pas contenu de ce répertoire
    • $SHELL= cette information cryptée est nécessaire pour garder le shell ouvert afin que vous puissiez travailler avec. Si vous voulez que le shell s'ouvre, exécutez votre commande, puis fermez-le, supprimez simplement cette partie. Cependant, je veux que l'onglet reste ouvert pour que je puisse faire de la programmation magique. :)
  • nous recommençons ensuite à la --tabpièce pour produire l'onglet 2, puis à nouveau pour l'onglet 3. Personnalisez au contenu de votre coeur.

Capture d'écran:

entrez la description de l'image ici

Gabriel Staples
la source
1
heureux d'avoir été utile) J'ai aussi des scripts sur lesquels je peux simplement cliquer et commencer à travailler sur le projet. Il y avait deux problèmes avec eux: beaucoup de fenêtres de terminaux (avec un écran totalement séparé pour elles) et des fenêtres qui se fermaient après un crash du serveur par exemple. Cette réponse résout mes deux problèmes avec --tab + $ SHELL. Nice
grabantot
1

commentant la réponse de Lekensteyn. Je sais que ceci est un ancien post, mais pour tous ceux qui trouvent cela utile (comme je viens de le faire) au lieu de créer un autre "script hacky" avec juste une fonction dans le script que vous appelez

hacky_function()
{
"$@"
exec "$SHELL"
}

Appelez votre script avec "arguments optionnels hacky_function de hacky_function -e / path / de x-terminal-emulator ici"

N'oubliez pas de mettre "$ @" à la fin du script

Sruli
la source
-2

Utilisez la commande screen et -d détachez-vous d'une session screen existante, puis reconnectez-vous ici. -M force une nouvelle session screen -S crée une session nommée au lieu d'utiliser le nom par défaut.

Jack Heath
la source
cette réponse n'est pas claire du tout, veuillez faire en sorte que cela soit plus compréhensible
azerafati
@azerafati en effet, l'écran n'ouvre aucune fenêtre de terminal ... n'est même pas prévu par cet impressionnant paquet ...
erm3nda