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 (начиная с версии 1.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)ФОРМАТЫ, чтобы получить список информации, которую вы можете получить и работать с ней.

ikrabbe
источник
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всякий раз, когда мне нужно

Карлес Фигерола
источник