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 found
et rails s
cré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é .
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.tab=" --tab-with-profile=Default"
??Réponses:
Je recommanderais d'utiliser
tmux
avectmuxinator
, il fera le travail pour vous, et vous pouvez également compter sur lesterminator
mises en page!Pour la
terminator
vérification de la mise en page, la réponse de mhnagaoka ici est également demandée:la source
Pour résumer quelques autres réponses et leurs commentaires, voici ce que j'ai fini par:
Notez que j'ai enlevé l'onglet «maître», ainsi que les profils et les titres (qui semblent obsolètes
gnome-terminal
).la source
$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)
Essaye ça:
sinon, l'expression entière après -e sera interprétée comme la commande.
Pour inclure des alias à partir de .bashrc, utilisez
-ic
au lieu dec
la source
bash: rails c: command not found
et '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 scriptrails c
sur un terminal sans autre chose? Peut-être que ça devrait l'êtrerails -c
?rvm list gemsets
et il est ditNo command 'rvm' found
.. exécutez la même commandervm list gemsets
dans 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?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 estcommand
, 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.la source
options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )
enoptions+=($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?