Comment exécuter xfce-terminal avec différentes commandes par onglet et continuer à utiliser les onglets après le retour des commandes?


20

Pour garder la vue d'ensemble, j'aime placer plusieurs commandes toujours dans le même ordre et les démarrer automatiquement ensemble (gradle, git, base de données, scala-REPL, jboss ...)

-H (maintenir) semble signifier que le terminal n'est pas fermé après la fin, mais comment puis-je mettre fin délibérément à un tel processus? Pas du tout? De telle manière que je puisse continuer à utiliser le terminal.

J'utilise xubuntu avec avec xfce4-terminal et bash. Existe-t-il une meilleure solution graphique pour démarrer plusieurs commandes, avec la possibilité de continuer à travailler dans cette fenêtre / cet onglet?

Mise à jour: Si vous ne connaissez pas ces commandes: Jboss et gradle produisent en continu une sortie que vous ne voulez pas avoir mélangée dans le même terminal. Et parfois, ils doivent être interrompus avec ^ C et redémarrés. Je n'aime pas rouvrir un terme xfce4 et accéder au répertoire dans lequel je dois agir.

La base de données et scala-REPL sont interactifs, il est donc inutile de les démarrer en arrière-plan.

Mon script de démarrage actuel navigue simplement vers les répertoires souhaités et ouvre tous les onglets dans le bon ordre pour les trouver toujours à la même position, en nommant chaque onglet à sa fin:

xfce4-terminal -T eclipse   --working-directory=/home/stefan/oximity -e "/opt/eclipse/eclipse" \
    --tab -T arandr --working-directory=/home/stefan/oximity -e "arandr /home/stefan/.screenlayout/oximity.sh" \
    --tab -T bash       --working-directory=/home/stefan/oximity \
    --tab -T gradle     --working-directory=/home/stefan/oximity/med \
    --tab -T git        --working-directory=/home/stefan/oximity/med \
    --tab -T mysql      --working-directory=/opt/mini/mysql \
    --tab -T jboss      --working-directory=/opt/mini/jboss \
    --tab -T jboss-log  --working-directory=/opt/mini/jboss/standalone/log \
    --tab -T scala-REPL --working-directory=/home/stefan/proj/mini/forum -e /opt/scala/bin/scala

Eclipse et arandr sont détachés du shell et s'exécutent dans leur propre fenêtre, donc le paramètre -e (execute) fonctionne. Je pense que pour le scala-REPL, cela fonctionne car c'est la dernière commande de la liste.


Votre question n'est toujours pas claire pour moi. Vous voulez qu'un terminal revienne au shell une fois que la commande avec laquelle il a été lancé se termine? Quelque chose comme ça xterm -e 'stuff;bash'?
frostschutz

1
Cette question a encore besoin de travail! J'ai trouvé ce fil, je pense que c'est ce que l'OP recherche: Comment garder le terminal xfce4 ouvert? . Il veut savoir comment accéder à un onglet où le commutateur "-H" a été utilisé et continuer à l'utiliser comme une fenêtre de terminal normale. OP, pouvez-vous s'il vous plaît confirmer si j'ai raison?
slm

@slm: Oui, j'aime garder le terminal ouvert pour traiter d'autres commandes - j'aime juste démarrer automatiquement la première de mes commandes et avoir plusieurs onglets nommés.
utilisateur inconnu

Réponses:


21

L' -H/-holdoption est de garder la fenêtre de l'émulateur de terminal ouverte une fois que les applications démarrées (shell ou autre) sont sorties. Dans cet état, rien de plus ne peut se produire.

Si vous souhaitez démarrer une commande en tant que travail d'un shell interactif dans l'émulateur de terminal xfce4-terminal et maintenir le shell en cours d'exécution et l'utiliser de manière interactive après la fermeture de l'application, avec bash, vous pouvez utiliser la $PROMPT_COMMANDvariable d'environnement pour xfce-terminaldémarrer un shell interactif qui démarre la commande donnée juste avant la première invite.

xfce4-terminal \
  -T eclipse \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; /opt/eclipse/eclipse" bash' \
  \
  --tab -T arandr \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; arandr /home/stefan/.screenlayout/oximity.sh" bash' \
  \
  --tab -T bash \
  --working-directory=/home/stefan/oximity \
  ...

De cette façon, les commandes sont des tâches de ce shell, ce qui signifie que vous pouvez les suspendre avec Ctrl-Zet les reprendre plus tard avec fg/bgcomme si vous les aviez saisies à l'invite de ce shell interactif.

Cela suppose cependant que vous ne définissez pas le $PROMPT_COMMANDdans votre ~/.bashrc. Notez également que l'état de sortie de la commande ne sera pas disponible dans $?.

Pour le rendre encore plus semblable à la commande entrée à l'invite du shell, vous pouvez même l'ajouter à la liste d'historique. Comme:

xfce4-terminal -T /etc/motd -e 'env PROMPT_COMMAND="
  unset PROMPT_COMMAND
  history -s vi\ /etc/motd
  vi /etc/motd" bash'

De cette façon, une fois que vous quittez vi, vous pouvez appuyer sur la Uptouche pour rappeler cette même vicommande.

Un moyen plus simple de l'écrire:

PROMPT_COMMAND='unset PROMPT_COMMAND; history -s "$CMD"; eval "$CMD"' \
  xfce4-terminal --disable-server \
          -T /etc/motd -e 'env CMD="vi /etc/motd" bash' \
    --tab -T       top -e 'env CMD=top bash'

Le:

xfce4-terminal -e 'sh -c "cmd; exec bash"'

La solution donnée dans d'autres réponses fonctionne mais présente certains inconvénients:

  1. Si vous appuyez sur Ctrl-Cpendant l' cmdexécution, cela tue l'extérieur shcar il n'y a qu'un seul groupe de processus pour les deux shet cmd.
  2. Vous ne pouvez pas utiliser Ctrl-Zpour suspendrecmd
  3. Comme dans l' $PROMPT_COMMANDapproche, l'état de sortie de la commande ne sera pas disponible dans $?.

Vous pouvez contourner 1 ci-dessus en faisant:

xfce4-terminal -e 'sh -c "trap : INT; cmd; exec bash"'

Ou:

xfce4-terminal -e 'sh -ic "cmd; exec bash"'

Avec ce dernier, vous pourrez également suspendre le processus avec Ctrl-Z, mais vous ne pourrez pas l'utiliser fg/bg. Vous pourrez continuer en arrière-plan en faisant un kill -s CONTsur le pid de cmd.


Sensationnel. C'est assez compliqué, mais cela semble fonctionner. :) Je ne sais pas pourquoi la récompense a disparu. Malheureusement, je n'avais pas eu le temps de tester les indices.
utilisateur inconnu

Je ne comprends pas vraiment toutes les règles du système de primes. Puisque je pense que vous méritez la prime, je redémarre une nouvelle prime.
utilisateur inconnu

Oui, les primes expirent après 7 jours, et vous avez 24 heures après pour les attribuer. Si vous ne les connaissez pas, ils sont assignés à n'importe quel utilisateur ayant le plus haut représentant (2 ou plus). Voici plus que vous n'avez jamais voulu savoir sur les primes 8-): meta.stackexchange.com/questions/16065/…
slm

1
@AdrianLopez, dans les bashscripts, il n'y a pas d'historique du tout car il n'y a pas d'édition de ligne ou d'interaction avec l'utilisateur sauf si vous utilisez read -edans votre script (et vous verrez quehistory -s text fonctionne là-bas pour amorcer l'historique vu par cela read -e). Ici, nous ne fonctionnons pas à history -spartir d'un script, mais à partir du $PROMPT_COMMANDcrochet d'un shell interactif.
Stéphane Chazelas

1
@ StéphaneChazelas Incroyable. Suite à votre autre réponse précieuse ici , je dois ajouter qu'au xfce4-terminalmoins la version 0.6.3 veut maintenant un paramètre supplémentaire - --disable-server- pour traverser l'environnement. Réf: lists.debian.org/debian-user/2017/10/msg00045.html .
ジ ョ ー ジ

5

Pour autant que j'ai compris votre question, vous souhaitez exécuter certains processus dans un terminal, pouvoir les Ctrl+ Cet ensuite garder la fenêtre ouverte, avec le shell.

Si j'ai raison, cela pourrait être accompli avec une commande comme celle-ci:

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"

Fonctionne-t-il avec plusieurs onglets?
utilisateur inconnu

@userunknown Bien sûr. Ajoutez simplement --tab avant les autres commandes. Par exemple, si vous vouliez exécuter "ls / etc" et "ls / dev", vous produiriez: xfce4-terminal -e "bash -c 'ls / etc; exec bash'" --tab -e "bash - c 'ls / dev; exec bash' "Si vous utilisez Gnome Terminal, vous devez également écrire --tab avant la première commande.
Rafael Cavalcanti

C'est un peu utile, mais pas autant que je l'espérais. Lorsque je démarre gradle avec `xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c 'gradle explodedWar explodedWarSync; bash' "` un onglet est ouvert, nommé mais il affiche "gradle: commande introuvable "lors de la saisie de la commande, cela fonctionne bien. Git, mysql et scala fonctionnent bien de cette façon, mais pour jboss, Ctrl-C met fin à l'ensemble de jboss-tab. Je ne pouvais que préparer le shell à partir de là - en faisant peut-être écho à la commande à saisir. Je ne comprends pas vraiment ce qui fait la différence ici.
utilisateur inconnu

1

plusieurs applications dans des xfce4-terminalonglets

Ajout d'un shell interactif à chaque onglet xfce

Vous pouvez utiliser ce hack pour ajouter un shell si / quand vous Ctrl+Cun onglet:

$ xfce4-terminal -H \
     --tab -T bash -e "bash -c 'top;bash'" \
     --tab -T git  -e "bash -c 'top;bash'"

Cela vous donnera les éléments suivants:

   SS de xfce avec onglets

   ss de xfce w / top Ctrl + C


0

Lorsque vous quittez le shell sans -Hle terminal, il sera également fermé. Avec cet indicateur, le terminal continuera de fonctionner, mais le processus shell est fermé et ne peut pas être relancé.

Je pense que vous essayez de comprendre que vous venez de démarrer votre terminal et que votre environnement de développement démarre?

Vous pouvez créer un script shell et y mettre toutes vos commandes. À la fin du script, vous démarrez simplement votre shell:

#!/bin/sh

gradle &
git &
... &
.... &
jboss &

$SHELL

# some cleanup commands if needed

Appelez ensuite ce script via xfce4-terminal -e /the/script. Lorsque vous quittez de$SHELL le processus parent (votre script) terminé, les tâches en arrière-plan recevront le signal de sortie et quitteront également.

Si vous voulez les garder en vie, utilisez par exemple nohup jboss &dans votre script


Cela ne fonctionne pas car gradle et jboss produisent en permanence une sortie. Vous n'aimez pas qu'ils mélangent leur sortie. La base de données et le terminal scala sont interactifs. Cela n'a aucun sens de les mettre en arrière-plan. L'idée d'ouvrir d'autres commandes dans différents onglets est que l'historique n'est rempli que de quelques commandes différentes pour un sujet et donc rapidement consultable.
utilisateur inconnu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.