17 votes

Ouverture de plusieurs onglets avec gnome-terminal

J'essaie de créer une commande qui ouvrira 3 services de la pile Rails, Rails s, spork, et autotest. Je peux exécuter ces commandes individuellement en ouvrant 3 terminaux, en allant dans le dossier app et en les exécutant. Je peux même ouvrir 3 nouveaux onglets et exécuter les commandes sur chacun d'eux.

Le problème est qu'ils échouent lorsque j'essaie d'ouvrir les onglets via gnome-terminal comme ceci :

gnome-terminal --tab --title="rails s" -e "rails s" --tab --title="spork" -e "spork" --tab --title="autotest" -e "autotest"

Erreur (pour spork et autotest) :

There was an error creating the child process for this terminal
Failed to execute child process "spork" (No such file or directory)

Étonnamment, cela fonctionne pour "Rails s" (l'onglet montre le serveur en cours d'exécution).

Des idées ?

16voto

Invoquer gnome-terminal trois fois et en enchaînant les commandes avec && ne le fera pas fonctionne, et les onglets n'apparaîtront pas dans le même terminal, et en fait vous devrez quitter le premier terminal pour que le suivant apparaisse.

La manière de s'assurer que tous vos onglets s'ouvrent dans une seule instance de gnome-terminal tout en même temps est d'utiliser le --tab-with-profile=PROFILENAME interrupteur. Dans la commande ci-dessous, vous pouvez laisser la première commande en tant que gnome-terminal --tab comme c'est la première fenêtre à être générée ; maintenant, tout ce que vous devez savoir est quel profil vous utilisez et vous pouvez utiliser --tab-with-profile=YourProfile pour invoquer les autres commandes et elles apparaîtront toutes en même temps dans le terminal original ouvert.

Voici votre commande modifiée :

gnome-terminal --tab --title="rails s" -e "rails s" --tab-with-profile=Default --title="spork" -e "spork" --tab-with-profile=Default --title="autotest" -e "autotest"

(Pour les futurs lecteurs : remplacez les noms de programmes donnés après -e pour tester la ligne de commande donnée ici ; n'oubliez pas vos cibles pour la commande -e doit être installé et en $PATH ; pour les choses qui ne sont pas dans $PATH utiliser un chemin absolu tel que, par exemple, /opt/mike/program )

N'oubliez pas de spécifier le profil réel que vous utilisez pour l'option --tab-with-profile interrupteurs. La première invocation de gnome-terminal doit utiliser --tab et tout le reste --tab-with-profile . Avec cette méthode, il devrait être possible d'ouvrir un grand nombre d'onglets tous dans la même instance de gnome-terminal .

Trouvez le profil que vous utilisez actuellement en faisant un clic droit dans gnome-terminal et regardez les profils et il y aura un marqueur sur celui que vous utilisez actuellement :

enter image description here

Allez à Préférences de profil pour plus d'informations et pour vérifier le nom du profil.

Pour plus d'informations, voir man gnome-terminal とのことです。 Manpages Ubuntu en ligne .


Note :

Si vous avez des difficultés à lancer vos programmes avec gnome-terminal soit ajouter l'emplacement à $PATH ou créez un lien symbolique et placez-le dans un répertoire de type $PATH ou (ce qui a été très utile ici) : créer un simple wrapper bash script et l'appeler dans le répertoire gnome-terminal ligne de commande ci-dessus. (Vous devez l'appeler avec un chemin absolu : i.e. /location/of/script et pas seulement son nom).

A titre d'exemple :

#!/bin/bash
cd $HOME/.rvm/gems/ruby-2.0.0-p0/bin 
spork
exit 0

Ensuite, nommez le script, rendez-le exécutable et appelez-le dans la section gnome-terminal ligne de commande ci-dessus. Faites cela pour tous les programmes non repo qui posent problème.

9voto

green Points 13802

Vous trouverez ci-dessous une réponse de stackoverflow.com

  1. Ajouter un eval "$BASH_POST_RC" à la fin de votre .bashrc

  2. Définissez le BASH_POST_RC variable d'environnement pour chaque onglet vers la commande que vous souhaitez exécuter, par exemple : gnome-terminal --working-directory="/home/zardoz/projects/my_rails_app" --tab -e 'bash -c "export BASH_POST_RC=\"rails server\"; exec bash"' --tab -e 'bash -c "export BASH_POST_RC=\"autotest\"; exec bash"'

0voto

gnome-terminal --tab -- sh -c "python3 'test.py' ; bash"

ce code ouvre un nouvel onglet dans le terminal en exécutant un script Python et quand il est terminé, ce nouvel onglet ne se ferme pas, car j'ai ajouté 'bash' à la fin de ce code...

si vous le voulez plusieurs fois, mettez-le dans une boucle while dans votre script bash.

0voto

sage Points 627

Comme discuté dans d'autres Q&R, la seule façon directe et non dépréciée d'ouvrir plusieurs onglets est de lancer la commande plusieurs fois, comme la réponse à la question dans Unix & LInux, Ouverture d'un nouveau terminal gnome (v3.28+) avec plusieurs onglets et différentes commandes par .

gnome-terminal -- bash -c "myCommand -some-args; bash"
gnome-terminal -- bash -c "myOtherCommand -some-args; bash"

Si je veux extraire une expression plus longue de chaque commande, il semble que je doive créer un script et l'appeler, ce que j'ai fait au lieu d'utiliser ; bash pour garder la fenêtre ouverte. J'ai utilisé un simple run_cmd.sh :

#! /bin/bash

set -euo pipefail

display_success() {
  read -p "Exited with success; press enter to exit..."
}

display_error() {
  read -p "Exited with error value $1; press enter to exit..."
}

run_cmd() {
  echo "Running: $@"
  "$@" && display_success || display_error $?
}

run_cmd "$@"

J'ai ensuite remplacé bash -c con run_cmd.sh . Puisque ce script est trivial, veuillez le considérer comme faisant partie du domaine public.

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