web-dev-qa-db-fra.com

Ouverture de plusieurs onglets de terminal et commande en cours d'exécution

Je dois ouvrir plusieurs onglets de terminal, leur donner des titres, accéder à un répertoire et faire en sorte que chaque onglet exécute une commande.

Je suis nouveau dans les scripts Linux et Shell, après avoir cherché en ligne et vérifié certaines solutions, j’ai créé ce script (ÉDITÉ en fonction des réponses ci-dessous):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'Rails s'"
titles[1]="Server"

cmds[2]="'Rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

Il ouvre les onglets, les nomme, mais n'exécute pas les commandes générant cette erreur:

Une erreur s'est produite lors de la création du processus enfant pour ce terminal.

Un autre inconvénient est que si j'arrête la commande en cours d'exécution, elle ferme l'onglet, ce que je ne veux pas. Je dois pouvoir arrêter la commande et l'exécuter à nouveau dans le même onglet.

Quel est le problème avec le script? Y a-t-il un autre moyen plus simple de faire cela?

Remarque: Si je supprime la partie (-e "\" bash -c $ {cmds [i]}; bash\"") de la commande, les onglets du répertoire donné sont ouverts et nommés, sans erreur.

-Edit-1:

Après avoir appliqué la réponse @Tuknutx ci-dessous et modifié le script, l'erreur n'apparaît plus, mais elle me donne bash: Rails c: command not found et Rails s crée une nouvelle application Rails au lieu de démarrer le Rails serveur, j'utilise .rmvrc pour sélectionner un gemset après avoir accédé à ce dossier.

9
Brary

Je recommanderais d'utiliser tmux avec tmuxinator , cela fera le travail à votre place, et vous pouvez également compter sur terminator!

Pour terminator layout checkout la réponse de mhnagaoka ici askubuntu aussi:

  1. Après avoir configuré votre mise en page, cliquez avec le bouton droit sur l’arrière-plan du terminal, puis choisissez Préférences Layouts et cliquez sur le bouton Ajouter .

  2. Donnez-lui un nom et cliquez sur Close .

  3. Cela devrait créer le fichier ~/.config/terminator/config mentionné.

  4. Vous pouvez maintenant démarrer Terminator en utilisant la disposition enregistrée en utilisant: terminator -l yourLayout (remplacez yourLayout par ce que vous avez choisi à l'étape 2).

  5. (facultatif) Editez le fichier ~/.config/terminator/config de manière à ce qu'il soit remplacé par [layouts] et imbriqué [[yourLayout]], renommez-le. yourLayout à par défaut et supprimez/renommez la présentation précédente par défaut . Désormais, lorsque Terminator démarrera sans aucun paramètre, il chargera votre présentation personnalisée [[default]]!

3
Islam Azab

Pour résumer quelques autres réponses et leurs commentaires, voici ce que j'ai fini par:

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

Notez que j'ai enlevé l'onglet 'master', ainsi que les profils et les titres (qui semblent être obsolètes dans gnome-terminal).

2
Ian Hincks

L'argument que vous donnez à l'option -e est "bash -c command; bash", y compris les guillemets. Il interprète cette chaîne entière comme le nom d'une commande! Essayez plutôt ceci: -e "bash -c 'command ; bash'". Ainsi, ce qui est exécuté sur la fenêtre de votre terminal est command, et ensuite, vous obtenez une fille Shell, ce qui, je suppose, est ce que vous voulez. Incidemment, vous pouvez aussi dire 'command & bash'; Cela exécutera la commande en arrière-plan et vous donnera immédiatement la fille Shell.

1
Silvio Levy

Essaye ça:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

sinon, toute l'expression après -e sera interprétée comme la commande.

Pour inclure les alias de .bashrc, utilisez -ic au lieu de c

1
TuKsn