Tmux - Obtenir le numéro de volet de chaque volet d'une fenêtre à partir d'un script?

12

Existe-t-il un moyen de connaître l'index de volet d'un volet particulier dans Tmux?

Je sais que je peux exécuter quelque chose comme:

tmux display-message -p  "#{pane_index}"  

mais cela ne fonctionne que sur le volet actif. Je veux que cela fonctionne pour n'importe quel volet dans lequel il est exécuté. Normalement, bien sûr, il est difficile d'exécuter un script dans un volet qui n'est pas le volet actif, mais vous pouvez le faire si vous utilisez le :set-window-option synchronize-panespour synchroniser l'entrée entre tous les volets.

Comment pourrais-je l'utiliser?

Dans mon travail, je dois me connecter à plusieurs serveurs identiques dans un équilibreur de charge en même temps, ce que je fais avec les volets Tmux. J'active normalement la fonction de synchronisation des volets pour me permettre d'avoir tout ce que je tape à l'identique envoyé à chaque volet en même temps. Cela fonctionne très bien.

Ce que je trouve, c'est que j'aimerais me connecter aux serveurs et faire quelque chose d'unique à chaque volet parfois, en utilisant le même "index de volet" à chaque fois. Par exemple, j'exécuterais une commande comme ceci:

ssh NODE_$(get_pane_number)

qui, une fois synchronisé et exécuté dans chaque volet, exécuterait les commandes suivantes dans une fenêtre à 4 volets:

ssh NODE_0 dans le volet 0

ssh NODE_1 dans le volet 1

ssh NODE_2 dans le volet 2

ssh NODE_3 dans le volet 3

Je pourrais bien sûr écrire ceci, mais cela ne fonctionnerait que bien avant de commencer à synchroniser les entrées. Il y a des moments où j'aimerais le faire après avoir également commencé à synchroniser les entrées.

Brad Parks
la source

Réponses:

12

tmux (depuis la v1.5) fournit TMUX_PANE dans l'environnement du processus qu'il lance pour un volet; chaque nouveau volet obtient une valeur unique au serveur. Donc, en supposant que TMUX_PANE est disponible dans votre environnement, cela devrait faire ce que je pense que vous voulez:

tmux display -pt "${TMUX_PANE:?}" '#{pane_index}'

La ${…:?}syntaxe d'un shell de type Bourne empêche l'expansion des paramètres manquants ou vides. Dans ce cas, une expansion vide reviendrait à la valeur par défaut d'utiliser «le volet actuellement actif», qui est généralement - mais pas toujours - le même que «ce volet» (ils différeront probablement si le tty de la commande n'est pas celui que tmux a démarré, par exemple à cause de l’utilisation de script ou expect , et cetera).

Chris Johnsen
la source
sucré! cela l'a totalement fait ... très apprécié!
Brad Parks
La syntaxe "$ {TMUX_PANE :?}" ne fonctionne pas dans fish-shell
CodyChan
2

Vous pouvez obtenir tous les index de volet ainsi que de nombreuses autres informations sur les volets avec

tmux list-panes -a

Voir tmux(1)FORMATS pour obtenir une liste des informations que vous pouvez obtenir et travailler avec.

ikrabbe
la source
1
merci pour les commentaires - mais cela ne me dit pas quel volet est lequel - juste qu'il y a des volets 0-3 dans une fenêtre, que je pourrais déjà comprendre. Je veux pouvoir écrire un script bash appelé get_pane_numberqui renvoie en fait le bon # sans que le volet soit actif.
Brad Parks
2

S'appuyant sur les deux solutions proposées, j'ai trouvé que cette fonction fonctionnait pour moi:

I=$(tmux list-panes -a | grep $TMUX_PANE 2>/dev/null | awk -F: '{print $2}' | awk -F. '{print $2}')

ou la même chose commençant par index = 1

I=$(($(tmux list-panes -a | grep $TMUX_PANE 2>/dev/null | awk -F: '{print $2}' | awk -F. '{print $2}') + 1))

Ce n'est pas le plus joli mais ça marche et je peux le déposer dans mon .bashrcet juste l'utiliser $Iquand j'ai besoin

Carles Figuerola
la source