web-dev-qa-db-fra.com

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

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 autre utilisé manuellement? (même des commandes comme "cd/foo/bar" ne fonctionnent pas avec gnome-terminal -e)

35
Zardoz

Une fois que gnome-terminal a démarré bash, il n’est plus dans la boucle 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 le chargement de ~/.bashrc.

Tout d’abord, dans de nombreux cas, il n’est pas nécessaire d’exécuter des commandes après ~/.bashrc. Par exemple, l’ouverture d’un terminal dans un répertoire particulier peut simplement être effectuée avec cd /foo/bar && gnome-terminal. Vous pouvez définir les variables d’environnement de la même manière: VAR=value gnome-terminal. (Si votre ~/.bashrc remplace les variables d'environnement, vous le faites mal: 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 souhaitez utiliser plusieurs onglets, vous devez utiliser -e au lieu de -x. Gnome-terminal divise inutilement l'argument de -e au lieu d'espaces plutôt que de l'exécuter via 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 <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 avez besoin d'exécuter des commandes après ~/.bashrc, assurez-vous qu'il lance les commandes. Par exemple, incluez le code suivant à la fin de ~/.bashrc:

eval "$BASH_POST_RC"

Puis 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 un texte déjà saisi sur la ligne de commande? .

43
Gilles

Lorsque vous utilisez l'option -e, le gnome-terminal exécute cette commande sans démarrer un nouveau shell (vous pouvez même exécuter quelque chose du genre: gnome-terminal -e gedit). Par conséquent, si vous souhaitez exécuter une commande dans le shell bash dans un nouveau terminal/onglet, vous devez procéder. quelque chose comme ça:

gnome-terminal -x bash -c "command"

Mais notez que lorsque "command" se termine, le terminal/onglet se termine également.

6
cYrus