web-dev-qa-db-fra.com

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

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

133
JSBach
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 konsole, il existe un drapeau --noclose.

Dans xterm, il existe un drapeau -hold.

Dans gnome-terminal, accédez à Modifier -> Préférences de profil -> Titre . Cliquez sur l'onglet Commande . Sélectionnez Tenez le terminal dans le menu déroulant intitulé à la fermeture de la commande . . Vous devez créer un nouveau profil pour cela et exécuter avec

gnome-terminal --window-with-profile = NOMDUPROFIL -e  commande 
131
nickguletskii

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, une nouvelle instance de Konsole est ouverte à chaque fois que j'exécute cette commande.

Heureusement, les terminaux semblent supporter l'option -e pour l'exécution d'une commande (je l'ai vérifiée pour konsole et 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 sous le nom /home/user/hacky et que vous l'avez rendu exécutable, vous devez exécuter 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 se trouve dans révision # 2 , c'était avant que je réalise que les arguments peuvent être passés à x-terminal-emulator.

54
Lekensteyn

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 s'exécuter dans une fenêtre de terminal

#!/bin/bash

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

L'autre post 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".

enter image description here

enter image description here

9
Karthik T

Aidé par réponse de @ nickguletskii , et mon propre commentaire sous sa réponse, et inspiré par le vote positif de @ grabantot sur mon commentaire, voici la méthode que je préfère utiliser, en particulier lorsque je souhaite que le terminal reste ouvert. peut 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; ls à l'intérieur. La partie $Shell à la fin oblige le shell à rester ouvert afin que vous puissiez voir sa sortie et continuer à l'utiliser (j'ai appris cela ailleurs sur le dépassement de capacité):

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 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 terminal gnome
  • --tab = ouvrir un onglet unique pour ce qui va suivre
  • --title="tab 1" = titre cet onglet "onglet 1"
  • --command="bash -c 'cd /etc; ls; $Shell'" = exécutez la commande bash -c 'cd /etc; ls; $Shell', qui est une commande que je viens de créer à titre d'exemple; voici ce qu'il fait:
    • bash -c dit que c'est une commande 'bash
    • cd /etc = 'c'hange' d'irectory dans le chemin "/ etc"
    • ls = 'Je n'ai pas le contenu de ce répertoire
    • $Shell = cette friandise cryptique est nécessaire pour garder le shell ouvert afin que vous puissiez l'utiliser. 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 partie --tab pour produire l'onglet 2, puis à nouveau pour l'onglet 3. Personnalisez au contenu de votre coeur.

Capture d'écran:

enter image description here

4
Gabriel Staples

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

1
Sruli