Tmux: ¿Obtener el panel # de cada panel en una ventana de un script?

12

¿Hay alguna manera de averiguar el índice del panel de un panel en particular en Tmux?

Sé que puedo ejecutar algo como:

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

pero eso solo funciona en el panel activo. Quiero que funcione para cualquier panel en el que se ejecute. Normalmente, por supuesto, es difícil ejecutar un script en un panel que no es el panel activo, pero puede :set-window-option synchronize-paneshacerlo si usa la sincronización para la entrada entre todos los paneles.

¿Cómo usaría esto?

En mi trabajo, necesito conectarme a varios servidores idénticos en un equilibrador de carga al mismo tiempo, lo que hago con los paneles Tmux. Normalmente enciendo la función de sincronización de paneles para permitirme enviar lo que escribo de forma idéntica a cada panel al mismo tiempo. Esto funciona muy bien.

Lo que encuentro es que me gustaría conectarme a los servidores y hacer algo único para cada panel a veces, usando el mismo "índice de panel" cada vez. Por ejemplo, ejecutaría un comando así:

ssh NODE_$(get_pane_number)

que, cuando se sincroniza y ejecuta en cada panel, ejecuta los siguientes comandos en una ventana con 4 paneles:

ssh NODE_0 en el panel 0

ssh NODE_1 en el panel 1

ssh NODE_2 en el panel 2

ssh NODE_3 en el panel 3

Por supuesto, podría escribir esto, pero eso solo funcionaría bien antes de comenzar a sincronizar las entradas. Hay momentos en que me gustaría hacer esto después de que también haya comenzado a sincronizar entradas.

Brad Parks
fuente

Respuestas:

12

tmux (desde v1.5) proporciona TMUX_PANE en el entorno del proceso que inicia para un panel; cada nuevo panel obtiene un valor único de servidor. Entonces, suponiendo que TMUX_PANE esté disponible en su entorno, esto debería hacer lo que creo que desea:

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

La ${…:?}sintaxis en un shell tipo Bourne evita la expansión de parámetros faltantes o vacíos. En este caso, una expansión vacía volvería al valor predeterminado de usar "el panel actualmente activo", que generalmente es, pero no siempre, lo mismo que "este panel" (probablemente diferirán si el comando tty no es el indicado). que tmux comenzó; por ejemplo, por usar script o esperar , etcétera).

Chris Johnsen
fuente
¡dulce! eso lo hizo totalmente ... muy apreciado!
Brad Parks
La sintaxis "$ {TMUX_PANE :?}" no funciona en fish-shell
CodyChan
2

Puede obtener todo el índice del panel, así como mucha otra información sobre los paneles con

tmux list-panes -a

Vea tmux(1)FORMATOS para obtener una lista de información que puede obtener y con la que puede trabajar.

ikrabbe
fuente
1
gracias por los comentarios, pero esto no me dice qué panel es cuál, solo que hay paneles 0-3 en una ventana, que ya pude resolver. Quiero poder escribir un script bash llamado get_pane_numberque realmente devuelva el # correcto sin que el panel esté activo.
Brad Parks
2

A partir de las dos soluciones propuestas, encontré que esta función funcionaba para mí:

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

o lo mismo comenzando con index = 1

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

No es el más bonito, pero funciona y puedo dejarlo en mi .bashrcy simplemente usarlo $Icuando lo necesite

Carles Figuerola
fuente