Tmux - Obter nº de painel de cada painel em uma janela a partir de um script?

12

Existe uma maneira de descobrir o índice do painel de um painel específico no Tmux?

Eu sei que posso executar algo como:

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

mas isso só funciona no painel ativo. Quero que funcione para qualquer painel em que ele seja executado. Normalmente, é difícil executar um script em um painel que não seja o painel ativo, mas você pode se usar a :set-window-option synchronize-panessincronização de entrada entre todos os painéis.

Como eu usaria isso?

No meu trabalho, preciso conectar-me a vários servidores idênticos em um balanceador de carga ao mesmo tempo, o que faço com os painéis do Tmux. Normalmente, ative o recurso de painéis de sincronização para que eu possa enviar o que eu digitar de forma idêntica para cada painel ao mesmo tempo. Isso funciona muito bem.

O que eu acho é que, às vezes, gostaria de conectar-me aos servidores e fazer algo exclusivo para cada painel, usando o mesmo "índice de painel" a cada vez. Por exemplo, eu executaria um comando assim:

ssh NODE_$(get_pane_number)

que, quando sincronizado e executado em cada painel, executaria os seguintes comandos em uma janela com 4 painéis:

ssh NODE_0 no painel 0

ssh NODE_1 no painel 1

ssh NODE_2 no painel 2

ssh NODE_3 no painel 3

É claro que eu poderia escrever isso, mas isso só funcionaria bem antes de começar a sincronizar as entradas. Há momentos em que eu gostaria de fazer isso depois de começar a sincronizar as entradas também.

Brad Parks
fonte

Respostas:

12

O tmux (desde a v1.5) fornece TMUX_PANE no ambiente do processo que inicia para um painel; cada novo painel obtém um valor exclusivo do servidor. Portanto, assumindo que o TMUX_PANE esteja disponível em seu ambiente, isso deve fazer o que eu acho que você deseja:

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

A ${…:?}sintaxe em um shell semelhante a Bourne impede a expansão de parâmetros ausentes ou vazios. Nesse caso, uma expansão vazia retornaria ao padrão de usar "o painel atualmente ativo", que geralmente é - mas nem sempre - o mesmo que "este painel" (eles provavelmente serão diferentes se o tty do comando não for o único que o tmux foi iniciado, por exemplo, por usar script ou expect , etc.

Chris Johnsen
fonte
doce! que totalmente fez isso ... muito apreciado!
Brad Parks
O "$ {TMUX_PANE :?}" sintaxe não funciona em peixes-shell
CodyChan
2

Você pode obter todo o índice do painel, bem como muitas outras informações sobre os painéis com

tmux list-panes -a

Consulte tmux(1)FORMATS para obter uma lista de informações com as quais você pode obter e trabalhar.

ikrabbe
fonte
1
obrigado pelo feedback - mas isso não me diz qual é o painel - apenas que existem painéis 0-3 em uma janela, o que eu já consegui descobrir. Quero poder escrever um script bash chamado get_pane_numberque realmente retorne o # certo sem que o painel esteja ativo.
Brad Parks
2

Com base nas duas soluções propostas, achei que essa função funcionava para mim:

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

ou a mesma coisa que começa com index = 1

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

Não é a mais bonita, mas funciona e posso colocá-la na minha .bashrce usar $Isempre que preciso

Carles Figuerola
fonte