Tmux - Uzyskaj skrypt nr każdego panelu w oknie ze skryptu?

12

Czy istnieje sposób na sprawdzenie indeksu poszczególnych okien w Tmux?

Wiem, że mogę uruchomić coś takiego:

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

ale działa to tylko w aktywnym panelu. Chcę, aby działał dla dowolnego panelu, w którym jest uruchomiony. Zwykle trudno jest uruchomić skrypt w panelu, który nie jest aktywnym panelem, ale możesz to zrobić, jeśli użyjesz :set-window-option synchronize-panesdo synchronizacji danych wejściowych między wszystkimi panelami.

Jak miałbym tego użyć?

W mojej pracy muszę jednocześnie łączyć się z wieloma identycznymi serwerami w module równoważenia obciążenia, co robię z panelami Tmux. Zwykle włączam funkcję synchronizacji okienek, aby umożliwić mi wysyłanie identycznych informacji do każdego panelu w tym samym czasie. To działa świetnie.

Uważam, że chciałbym połączyć się z serwerami i czasami zrobić coś unikalnego dla każdego panelu, używając za każdym razem tego samego „indeksu okien”. Na przykład uruchomiłbym polecenie tak:

ssh NODE_$(get_pane_number)

który po zsynchronizowaniu i uruchomieniu w każdym panelu uruchomiłby następujące polecenia w oknie z 4 panelami:

ssh NODE_0 w okienku 0

ssh NODE_1 w okienku 1

ssh NODE_2 w okienku 2

ssh NODE_3 w okienku 3

Oczywiście mógłbym to napisać, ale działałoby to dobrze, zanim zacznę synchronizować dane wejściowe. Są chwile, kiedy chciałbym to zrobić po tym, jak zacząłem synchronizować dane wejściowe.

Brad Parks
źródło

Odpowiedzi:

12

tmux (od wersji 1.5 ) dostarcza TMUX_PANE w środowisku procesu, który uruchamia dla panelu; każdy nowy panel otrzymuje wartość unikalną dla serwera. Zakładając, że TMUX_PANE jest dostępny w twoim środowisku, to powinno zrobić to, co myślę, że chcesz:

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

${…:?}Składniowe w Bourne jak powłoka zapobiega ekspansji brakującymi lub pustych parametrów. W takim przypadku puste rozszerzenie powróciłoby do wartości domyślnej polegającej na użyciu „aktualnie aktywnego panelu”, co zwykle jest - ale nie zawsze - takie samo jak „to okno” (prawdopodobnie będą się różnić, jeśli tty polecenia nie jest tym że tmux zaczął się, np. z powodu użycia skryptu lub spodziewaj się , i tak dalej).

Chris Johnsen
źródło
Słodkie! to całkowicie to zrobiło ... bardzo mile widziane!
Brad Parks,
Składnia „$ {TMUX_PANE :?}” nie działa w skorupach ryb
CodyChan
2

Możesz uzyskać wszystkie indeksy okien, a także wiele innych informacji o panelach

tmux list-panes -a

Zobacz tmux(1)FORMATY, aby uzyskać listę informacji, które możesz uzyskać i z którymi możesz pracować.

ikrabbe
źródło
1
dzięki za opinie - ale to nie mówi mi, który panel jest który - tylko, że w oknie są panele 0-3, które już mogłem zrozumieć. Chcę mieć możliwość napisania skryptu bash o nazwie, get_pane_numberktóry faktycznie zwraca właściwy # bez aktywnego panelu.
Brad Parks,
2

Opierając się na dwóch proponowanych rozwiązaniach, znalazłem dla siebie tę funkcję:

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

lub to samo, zaczynając od indeksu = 1

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

Nie jest najładniejszy, ale działa i mogę go wrzucić .bashrci używać, $Ikiedy tylko zajdzie taka potrzeba

Carles Figuerola
źródło