Ouvrez le terminal gnome par programme et exécutez les commandes après l'exécution de bashrc

35

Pour démarrer mon environnement de développement, j’ai écrit un petit script. Une partie consiste à ouvrir un terminal gnome avec plusieurs onglets où certaines commandes doivent automatiquement être exécutées. Certaines de ces commandes dépendent d'un fichier .bashrc déjà exécuté. Mais en utilisant

gnome-terminal --tab -e "commande" --tab --tab

la commande est exécutée avant l'exécution de .bashrc. Est-il possible de faire en sorte qu'un gnome-terminal automatisé se comporte comme un serveur utilisé manuellement? (même des commandes comme "cd / foo / bar" ne fonctionnent pas avec gnome-terminal -e)

Zardoz
la source

Réponses:

45

Une fois que gnome-terminal a démarré bash, il n’a plus rien à faire en ce qui concerne l’exécution des commandes: il ne gère que les entrées et les sorties. Vous aurez donc besoin de la coopération de bash pour exécuter quelque chose après ~/.bashrcson chargement.

Premièrement, dans de nombreux cas, vous n'avez pas réellement besoin d'exécuter des commandes après ~/.bashrc. Par exemple, l’ouverture d’un terminal dans un répertoire particulier peut simplement être réalisée cd /foo/bar && gnome-terminal. Vous pouvez définir des variables d'environnement d'une manière similaire: VAR=value gnome-terminal. (Si vous ~/.bashrcremplacez les variables d'environnement, vous vous y trompez: les définitions de variable d'environnement appartiennent à~/.profile )

Pour exécuter des commandes dans le terminal, mais avant ~/.bashrc, vous pouvez faire

gnome-terminal -x sh -c 'command1; command2; exec bash'

Si vous voulez utiliser plusieurs onglets, vous devez utiliser à la -eplace de -x. Gnome-terminal divise inutilement l'argument de -eat au lieu de l'exécuter à travers un shell. Néanmoins, vous pouvez écrire une commande shell si vous vous assurez de ne pas y inclure d'espaces. Au moins avec gnome-terminal 2.26, vous pouvez utiliser des tabulations (toutefois, remplacez-les <TAB>par un caractère de tabulation littéral):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

Si vous devez exécuter des commandes après ~/.bashrc, faites- le exécuter. Par exemple, incluez le code suivant à la fin de ~/.bashrc:

eval "$BASH_POST_RC"

Ensuite, pour lancer un peu de code après (vraiment, à la fin de) votre bashrc:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

ou (moins lourd sur la citation)

BASH_POST_RC='command1; command2' gnome-terminal

Bien que je ne recommande pas particulièrement de le faire de cette façon, vous pouvez être intéressé par les techniques mentionnées dans Comment démarrer un terminal avec du texte déjà saisi sur la ligne de commande? .

Gilles, arrête de faire le mal
la source
Oui, en effet un bon tour. Jamais pensé à ça. Maintenant, je dois trouver un moyen de définir la variable BASH_POST_RC différemment pour l'onglet spécifique. Et cela semble toujours être un problème. Un simple "gnome-terminal --tab -e 'BASH_POST_RC = ls' --tab" n'est pas possible :-(
Zardoz
@ Zardoz: En fait, vous pouvez tromper gnome-terminal en utilisant des caractères de tabulation (voir ma réponse révisée). Attention aux multiples niveaux de citation.
Gilles, arrête de faire le mal '11
.. ça marche :-) ... merci beaucoup pour votre solution et votre patience. Voici ma commande complète (fonctionne même avec ces espaces dans les commandes: 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 "exportation BASH_POST_RC = \" autotest \ "; exec bash" '--tab
Zardoz
Finalement, ça a fonctionné ... Après tellement de tests avec de nombreuses citations. Voici le mien, utilisant zsh et ouvrant un serveur et une console à la fois:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
Augustin Riedinger
1
@terdon Non, gnome-terminal -en'invoque pas du tout un shell. Si vous exécutez gnome-terminal -e 'sleep 9', la commande est exécutée sleepavec l'argument 9et aucun shell n'est impliqué. Si vous exécutez, gnome-terminal -e 'sleep 9;bash'le terminal s'ouvre et se ferme immédiatement, car il se sleepplaint que l' 9;bashintervalle de temps n'est pas valide. Vous pouvez observer ce qui se passestrace -f -eexecve gnome-terminal -e …
Gilles 'SO- arrête d'être méchant'
6

Lorsque vous utilisez l' -eoption, la gnome-terminalcommande sera exécutée sans démarrer un nouveau shell (vous pouvez même exécuter quelque chose du genre:) gnome-terminal -e gedit, donc si vous voulez exécuter une commande dans le bashshell dans un nouveau terminal / onglet, procédez comme suit:

gnome-terminal -x bash -c "command"

Mais notez que quand "command"se termine le terminal / onglet se terminera aussi.

cYrus
la source
1
Je pense que vous voulez dire gnome-terminal -x bash -c "command"( -eattend un seul argument). Et c'est assez simple d'exécuter un shell après command, du moins tant que vous ne démarrez qu'un seul onglet - voyez ma réponse .
Gilles, arrête de faire le mal
gnome-terminal -x "bash" -c "command"a travaillé pour moi. Notez les guillemets sur la valeur -x arg.
m3nda
Je reçois # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo
1
s'il vous plaît, que faisons - nous depuis les -xet -eoptons sont déconseillés ???
Nyxee
Je crois que cela ne s'exécute pas ~/.bashrcavant l'exécution de la commande, comme demandé à l'origine par l'OP.
IgNite