Tmux - отримати панель № кожної області у вікні зі сценарію?


12

Чи є спосіб дізнатись індекс панелі певної області в Tmux?

Я знаю, що можу запустити щось на кшталт:

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

але це працює лише на активній панелі. Я хочу, щоб він працював на будь-якій панелі, в якій він запускається. Звичайно, звичайно, важко запустити сценарій на панелі, яка не є активною панеллю, але ви можете, якщо ви використовуєте :set-window-option synchronize-panesдля синхронізації вводу між усіма панелями.

Як би я цим скористався?

У своїй роботі мені потрібно одночасно підключатися до декількох однакових серверів у балансирі навантаження, що я роблю з панелями Tmux. Я зазвичай включаю функцію панелей синхронізації, щоб дозволити мені все, що я вводять, однаково надсилалося до кожної панелі. Це чудово працює.

Мені здається, що я хотів би інколи підключатися до серверів і робити щось унікальне для кожної області, використовуючи один і той же "індекс панелі" кожен раз. Наприклад, я б запустив таку команду:

ssh NODE_$(get_pane_number)

які при синхронізації та запуску в кожній панелі виконували б наступні команди у вікні з 4 панелями:

ssh NODE_0 в області 0

ssh NODE_1 в області 1

ssh NODE_2 в області 2

ssh NODE_3 на панелі 3

Я, звичайно, міг би це сценарій, але це спрацювало б лише до того, як я почав синхронізувати входи. Бувають випадки, коли я хотів би це зробити після того, як я також почав синхронізувати входи.

Відповіді:


12

tmux (оскільки v1.5) забезпечує TMUX_PANE в середовищі процесу, який він запускає для панелі; кожна нова панель отримує унікальне для сервера значення. Отже, якщо припустити, що TMUX_PANE доступний у вашому оточенні, то це має робити те, що я думаю, що ви хочете:

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

${…:?}Синтаксис в Bourne-подібні оболонки запобігають розширення відсутніх або порожніх параметрів. У цьому випадку порожнє розширення повернеться до типового використання «поточно активної панелі», яка зазвичай - але не завжди - така сама, як «ця панель» (вони, ймовірно, будуть відрізнятися, якщо tty команди не є тією що tmux запустився; наприклад, через використання скрипту або очікування та ін.


солодкий! що повністю зробив це ... дуже вдячний!
Бред Паркс

Синтаксис "$ {TMUX_PANE :?}" не працює в рибній оболонці
CodyChan

2

Ви можете отримати весь індекс панелі, а також багато іншої інформації про області

tmux list-panes -a

Див. tmux(1)ФОРМАТИ, щоб отримати список інформації, яку ви можете отримати та працювати.


1
дякую за відгук - але це не говорить мені, яка саме панель - лише, що у вікні є панелі 0-3, які я вже міг зрозуміти. Я хочу мати змогу написати скрипт bash, який називається, get_pane_numberщо фактично повертає право #, не активувавши панель.
Бред Паркс

2

Спираючись на два запропоновані рішення, я знайшов цю функцію для мене:

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

або те саме, що починається з індексу = 1

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

Це не найкрасивіше, але він працює, і я можу його кинути в своє .bashrcі просто використовувати, $Iколи мені потрібно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.