web-dev-qa-db-fra.com

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

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-keys, mais il semble qu'il devrait y avoir quelque chose qui prend une commande ou une liste de commandes à exécuter.

53
cjroebuck

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 un moyen d'ajouter des processus supplémentaires à un volet une fois qu'il a été démarré avec sa commande initiale. C’est au processus de cette commande initiale (généralement un shell) de fournir le contrôle des tâches.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 -k pour tuer 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 fonctionne actuellement 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 commande send-keys, vous devez en fait taper les lettres Enter, à dire tmux pour envoyer une clé de nouvelle ligne à la fenêtre. (Naturellement, chaque commande se termine par le Enter clé.)


1Le contrôle de tâche est l’arbitrage entre plusieurs groupes de processus d’une même session utilisant le terminal comme terminal de contrôle. C'est-à-dire le Ctrl+Z touche de suspension, et les commandes jobs, fg et bg.

72
Chris Johnsen

Vous pouvez utiliser C-m au lieu de Enter. C'est la même chose. De plus, tmux facilite l'envoi vers le volet droit/gauche en utilisant -t right ou -t left. Et si vous souhaitez adresser un volet dans une autre fenêtre, il suffit de le préfixer avec le numéro et le point de la fenêtre, comme -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.

9
Aleksey Gureiev