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.

cjroebuck
la source

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.

Chris Johnsen
la source
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.

Aleksey Gureiev
la source