¿Cómo obtener el índice de cada panel en una ventana con paneles sincronizados?

¿Cómo obtener el índice de cada panel en una ventana con paneles sincronizados?

Supongamos el siguiente escenario. Tengo máquinas con nombres host1a host4las que quiero conectarme en un panel cada una.

He dividido mi ventana de Tmux de manera uniforme en cuatro paneles para que cada uno de ellos pueda albergar una conexión SSH a esos hosts.

Todo está bien cuando ya está conectado y con los paneles sincronizados. Puedo emitir comandos que se ejecutan en todos los hosts simultáneamente.

Sin embargo, ahora estaba pensando que sería bastante bueno poder conectarme a cada host emitiendo elexactamente el mismo comando. De esta manera podría habilitar la sincronización entre paneles incluso antes de conectarme a esos hosts.

Lamentablemente, no puedo encontrar un método que funcione. Lo que probé fue esto:

ssh root@host$(tmux run "echo '#{pane_index}'")

La idea aquí es que esto debería resolverse ssh root@host1dependiendo ssh root@host4del panel en el que se ejecute el comando.

Desafortunadamente el resultado fue bastante inesperado. Aunque el comando se ejecutó (mientras el panel 1 estaba activo), todas las conexiones se establecieron en host1. Evidentemente, esa variable pane_indexse refiere al panel actualmente activo en lugar del panel en el que se emite el comando.

¿Cómo puedo lograr conectarme host1mediante host4el uso del índice del panel (u otra cosa) emitiendo elexactamente el mismo comandoen cada panel, en lugar de tener que escribir comandos individuales?

NB: todos los índices comienzan en 1, pero, por supuesto, esto podría funcionar incluso si ese no fuera el caso, por ejemplo, mediante $((...))Bash.

Respuesta1

Hay pocos problemas.

  1. Para $(foo)que funcione foodebe imprimir la información deseada en su salida estándar. tmux run …no hace esto; élmuestrael resultado en modo copia. Quieres tmux display -p ….

  2. tmux display -p '#{pane_index}'puede brindarle números útiles cuando invoca el comando panel por panel, pero en los paneles sincronizados la salida será idéntica. Esto se debe a que si no especifica un panel (con -t), se asume el panel actualmente activo. Cuando invoca panel por panel, cada vez que el panel adecuado está activo. Cuando invoca paneles sincronizados, exactamente un panel está activo y todos los comandos devolverán su índice.

  3. Para identificar de manera confiable el panel en el que se ejecuta un comando, use la $TMUX_PANEvariable de entorno. En su caso no puede hacer esto directamente.

    # flawed
    ssh root@host"${TMUX_PANE#%}"
    

    El problema es $TMUX_PANEcorresponde a #{pane_id}, no a #{pane_index}. Los ID del panel son únicos en todo el servidor tmux. Obtendrá %0, %1, %2, %3para los primeros cuatro paneles creados. Los paneles en cuestión también pueden mostrarle %7, %8, %13, %14, si se crearon otros paneles antes y mientras tanto.

    La forma correcta es utilizar $TMUX_PANEpara especificar un panel y #{pane_index}recuperar el número deseado.

Solución:

ssh root@host"$(tmux display -p -t "$TMUX_PANE" '#{pane_index}')"

Genera host0... host3pero parece que sabes qué hacer para conseguir host1... host4Decidí no ofuscar la solución con $((…)).

Respuesta2

Puede usar la variable $TMUX_PANEque tmux coloca en el entorno del comando de cada panel. Por ejemplo si das el comando

tmux send-keys  'echo host${TMUX_PANE#%}' Enter

verá en cada panel host0, o host1, y así sucesivamente. Entonces reemplaza echo por tu comando ssh.

información relacionada