204 votes

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

J'ai trois scripts que je dois exécuter lorsque je démarre ma machine Ubuntu, ils démarrent des services que j'utilise dans mon environnement de développement.

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

Existe-t-il un moyen de créer un script qui ouvrira trois terminaux et exécutera une commande dans chacun d'eux ? (Chaque commande devrait être dans une fenêtre de terminal séparée afin que je puisse voir leur sortie).

192voto

vassie Points 406
gnome-terminal -- command

o

xterm -e command

o

konsole -e command

A peu près

terminal -e command

Pour que le terminal reste en place lorsque la commande se termine :

Dans konsole, il y a un --noclose drapeau.

Dans xterm, il y a un -hold drapeau.

Sur gnome-terminal Allez sur Modifier -> Préférences de profil -> Titre . Cliquez sur le bouton Commande onglet. Sélectionnez Tenez le terminal dans le menu déroulant intitulé Quand la commande sort . Vous devriez créer un nouveau profil pour cela et l'exécuter avec

gnome-terminal --window-with-profile=**_NAMEOFTHEPROFILE_** -e **_command_**

79voto

Lekensteyn Points 162346

Au lieu de coder en dur gnome-terminal , konsole etc., 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, il ouvre une nouvelle instance de Konsole chaque fois que j'exécute cette commande.

Heureusement, les terminaux semblent supporter le -e pour l'exécution d'une commande (je l'ai vérifié pour l'option konsole et gnome-terminal ). Les arguments après la commande sont transmis à 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 en tant que /home/user/hacky et le rendre exécutable, vous lanceriez vos scripts avec :

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

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

Ma tentative précédente d'exécuter un script dans une nouvelle fenêtre de terminal peut être trouvée dans révision n°2 c'était avant que je ne réalise que des arguments peuvent être passés à x-terminal-emulator .

16voto

Gabriel Staples Points 5149

MISE À JOUR 17 FÉV 2020 : cette réponse est maintenant peut-être obsolète.

Pensez à cliquer sur ce lien et à utiliser mon autre réponse à la place : Ouvrir le terminal avec plusieurs onglets et exécuter l'application


Avec l'aide de La réponse de @nickguletskii et mon propre commentaire sous sa réponse, et inspiré par l'upvote de @grabantot sur mon commentaire, voici ma façon préférée de procéder, en particulier lorsque je veux que le terminal reste ouvert pour pouvoir ensuite l'utiliser manuellement.

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

Voici un exemple artificiel, qui ouvre un seul onglet, l'intitule "test", puis exécute la commande simple suivante cd /etc; ls à l'intérieur. Le site $SHELL à la fin force le Shell à rester ouvert pour que vous puissiez ensuite 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 compliqué qui ouvre 3 onglets distincts dans le même terminal gnome. C'est exactement le genre de choses que fait mon raccourci sur le bureau pour que je puisse 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 le détail de la commande ci-dessus :

  • gnome-terminal = ouvrir un terminal gnome
  • --tab = ouvrir un onglet unique pour ce qui vient ensuite
  • --title="tab 1" = intituler cet onglet "onglet 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'" = exécuter le bash -c 'cd /etc; ls; $SHELL' qui est une commande que je viens d'inventer à titre d'exemple ; voici ce qu'elle fait :
  • bash -c dit qu'il s'agit d'une 'c'ommande' bash
  • cd /etc = 'c'hange 'd'irectory into the "/etc" path
  • ls = 'l'i's't contenu de ce répertoire
  • $SHELL = cette partie cryptique est nécessaire pour garder le Shell ouvert afin que vous puissiez travailler avec lui. Si vous voulez que le Shell s'ouvre, exécute votre commande, puis se ferme, enlevez simplement cette partie. Moi, par contre, je veux que l'onglet reste ouvert pour que je puisse aller faire de la programmation magique :)
  • nous recommençons alors à l'étape --tab pour produire l'onglet 2, puis à nouveau pour l'onglet 3. Personnalisez à votre guise.

Capture d'écran :

enter image description here

10voto

Karthik T Points 1951

Tout simplement

#!/bin/bash

/etc/init.d/ccpd status

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

#!/bin/bash

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

L'autre poste prévu [] pour être un substitut

Ici, "NAMEOFTHEPROFILE" doit être remplacé par le nom du profil qui "maintient le terminal lorsque la commande se termine".

enter image description here

enter image description here

1voto

Sruli Points 195

Commentant la réponse de Lekensteyn. Je sais que c'est un vieux post, mais pour tous ceux qui trouvent cela utile (comme je viens de le faire) Au lieu de faire un autre "hacky script" avec juste mettre une fonction à l'intérieur du script que vous appelez

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

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

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


Mise à jour de ce que j'utilise maintenant (2022)

#!/usr/bin/expect -f
# Get a Bash shell 
spawn -noecho bash
# Wait for a prompt 
expect "$ "
send "sudo /home/user/script.sh arg"
# Hand over control to the user
interact
exit

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X