Exécuter ou envoyer une commande sur un volet tmux dans une session tmux en cours d'exécution


61

Je souhaite écrire un script shell qui sera associé à une session nommée tmux, sélectionner une fenêtre (ou un volet) dans cette session et exécuter une commande dans la fenêtre ou le volet sélectionné.

Comment puis-je faire cela à partir d'un script bash?

je connais

tmux new-window -n:mywindow 'exec something'

me permet d’envoyer des commandes à une fenêtre fraîchement créée, mais j’ai besoin de quelque chose comme

tmux select-window -t:0 'my command'

Je suppose que je pourrais utiliser send-keysmais il semble qu'il devrait y avoir quelque chose qui prend une commande ou une liste de commandes à exécuter.

Réponses:


83

Chaque volet tmux est une interface pour un seul pty (pseudo tty). Les fenêtres non divisées ont un seul volet; Les fenêtres divisées ont plusieurs volets.

tmux ne fournit pas de moyen d'ajouter des processus supplémentaires à un volet une fois qu'il a été démarré avec sa commande initiale. Il appartient au processus de cette commande initiale (généralement un shell) de fournir le contrôle de tâche 1 pour ce terminal.

Si vous souhaitez masquer tout ce qui est en cours d'exécution dans le volet, vous pouvez utiliser respawn-pane -kpour supprimer la commande existante et la remplacer par une nouvelle (par exemple, respawn-pane -t sessionname:0.4 -k 'some -new command').

Toutefois, si vous souhaitez conserver tout ce qui est en cours d’exécution dans le volet, il n’y aura peut-être pas de meilleure option que de simplement «taper dessus» avec send-keys.

Vous pouvez écrire le script comme ceci (attachez-le en dernier, car sinon le script attendra que vous vous détachiez avant de continuer):

session=whatever
window=${session}:0
pane=${window}.4
tmux send-keys -t "$pane" C-z 'some -new command' Enter
tmux select-pane -t "$pane"
tmux select-window -t "$window"
tmux attach-session -t "$session"

Notez que, sur la send-keyscommande, vous devez réellement taper les lettres E n t e r, pour indiquer qu’il tmuxfaut envoyer une touche de nouvelle ligne à la fenêtre. (Naturellement, chaque commande se termine par la Enterclé.)


1 Le contrôle de tâche est l'arbitrage entre plusieurs groupes de processus d'une même session utilisant le terminal de contrôle comme terminal de contrôle. -À- dire, la Ctrl+ Ztouche de suspension, et les jobs, fget les bgcommandes shell.


2
Merci pour cela! Je mets #{session_name}:#{window_index}.#{pane_index}dans ma ligne d'état afin de pouvoir rapidement voir à quel volet envoyer des commandes.
Un nerd payé

11

Vous pouvez utiliser C-mau lieu de Enter. C'est la même chose. En outre, tmuxil est facile d'envoyer dans le volet droite / gauche en utilisant -t rightou -t left. Et si vous souhaitez adresser un volet dans une autre fenêtre, il suffit de le préfixer avec le numéro de la fenêtre et le point, par exemple -t 0.right.

Vous pouvez maintenant écrire une simple fonction Bash pour obtenir la séquence de clés en argument et l'envoyer facilement au volet cible.

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.