Ouverture de plusieurs onglets de terminal et exécution de la commande

9

Je dois ouvrir plusieurs onglets de terminal, leur donner des titres, aller dans un répertoire et faire exécuter une commande à chaque onglet.

Je suis nouveau sur Linux et les scripts shell, après avoir recherché en ligne et vérifié certaines solutions, j'ai fait ce script ( EDITED basé sur les 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 ne parvient pas à exécuter 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, il 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? Existe-t-il un autre moyen plus simple de le faire?

Remarque: Si j'ai supprimé la partie (-e "\" bash -c $ {cmds [i]}; bash \ "") de la commande, il ouvre les onglets dans le répertoire donné et les nomme, 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 foundet rails scrée une nouvelle application rails au lieu de démarrer le serveur rails, j'utilise .rmvrc pour sélectionner un jeu de gemmes une fois que ce dossier est accédé .

Brary
la source
Si vous voulez que votre script s'exécute sur votre démarrage Ubuntu: - vous pouvez exécuter votre script en tant que service parvenu ( help.ubuntu.com/community/UbuntuBootupHowto ) ou: utiliser des "applications de démarrage" dans votre environnement de bureau
Aboelnour
si j'écris cmds[1]="'ping 192.168.9.9'"cela me donne la même erreur , mais je résolu en supprimant seule citation. Donc, si j'écris, cmds[1]="ping 192.168.9.9"ça marche.
daisy
@Brary mais je ne comprends pas pourquoi il ouvre trois onglets, un par défaut et deux autres qui sont définis dans le script. Parce que nous définissons tab=" --tab-with-profile=Default"??
daisy

Réponses:

3

Je recommanderais d'utiliser tmuxavec tmuxinator, il fera le travail pour vous, et vous pouvez également compter sur les terminatormises en page!

Pour la terminatorvérification de la mise en page, la réponse de mhnagaoka ici est également demandée:

  1. Après avoir configuré votre mise en page, faites un clic droit sur n'importe quel arrière-plan de terminal et choisissez Préférences → onglet Mises en page et cliquez sur le bouton Ajouter .

  2. Donnez-lui un nom et appuyez sur Fermer .

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

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

  5. (facultatif) Modifiez le ~/.config/terminator/configfichier de sorte que là où il est dit [layouts]et imbriqué en dessous [[yourLayout]], renommez yourLayout par défaut et supprimez / renommez la disposition par défaut précédente . Maintenant, lorsque Terminator démarre sans aucun paramètre, il chargera votre [[default]]mise en page personnalisée !

Islam Azab
la source
2

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 «maître», ainsi que les profils et les titres (qui semblent obsolètes gnome-terminal).

Ian Hincks
la source
La sortie de $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.«Utilisez« - »pour terminer les options et mettre la ligne de commande à exécuter après. . that's an output but the comands get executed. When i use $ tab - `la commande n'est pas exécutée et le terminal affiche:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee
1

Essaye ça:

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

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

Pour inclure des alias à partir de .bashrc, utilisez -icau lieu dec

TuKsn
la source
L'erreur n'apparaît plus, merci. Mais cela me donne bash: rails c: command not foundet 'rails s' crée une nouvelle application rails au lieu de démarrer le serveur rails. Cela change la portée de la question, je vais l'éditer avec votre modification pour le script
Brary
Cela at-il fonctionné si vous essayez rails csur un terminal sans autre chose? Peut-être que ça devrait l'être rails -c?
TuKsn
J'ai essayé de ne pas marcher. J'ai même essayé rvm list gemsetset il est dit No command 'rvm' found.. exécutez la même commande rvm list gemsetsdans le premier onglet qui s'ouvre sans exécuter de commande et cela a fonctionné! exécute-t-il la commande avant le chargement de l'environnement et le chargement du fichier .rvmrc?
Brary
1

L'argument que vous donnez à l'option -e "bash -c command; bash"inclut les guillemets. Il interprète cette chaîne entière comme le nom d'une commande! Essayez ceci: -e "bash -c 'command ; bash'". De cette façon, ce qui est exécuté sur votre fenêtre de terminal est command, et après cela s'exécute, vous obtenez un shell fille, ce qui, je suppose, est ce que vous voulez. Soit dit en passant, vous pouvez également dire 'command & bash'; cela exécutera la commande en arrière-plan et vous donnera immédiatement le shell fille.

Silvio Levy
la source
J'ai changé cela options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )en options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )et cela m'a donné la même erreur .. est-ce que je le fais bien?
Brary
Pas tout à fait correct: supprimez \ "avant le premier bash et \" après le 'après le deuxième bash.
Silvio Levy
Merci, j'ai édité la question et changé la portée de celle-ci pour inclure les rails et les RVM.
Brary