Как получить индекс каждой панели в окне с синхронизированными панелями?

Как получить индекс каждой панели в окне с синхронизированными панелями?

Предположим следующий сценарий. У меня есть машины, названные host1через host4, к которым я хочу подключиться в одной панели.

Я разделил окно Tmux поровну на четыре панели, чтобы каждая из них могла размещать SSH-подключение к этим хостам.

Все отлично, когда уже подключено и панели синхронизированы. Я могу давать команды, которые выполняются на всех хостах одновременно.

Однако теперь я подумал, что было бы неплохо иметь возможность подключаться к каждому хосту, выполнив командуточно такая же команда. Таким образом я мог включить синхронизацию между панелями еще до подключения к этим хостам.

Увы, я не могу придумать работающий метод. Я попробовал следующее:

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

Идея здесь в том, что это должно разрешаться ssh root@host1в ssh root@host4зависимости от панели, в которой команда будет запущена.

К сожалению, результат оказался довольно неожиданным. Несмотря на то, что команда была выполнена (пока панель 1 была активна), все соединения были установлены с host1. Так что, очевидно, эта переменная pane_indexотносится к активной в данный момент панели, а не к панели, в которой выполняется команда.

Как я могу добиться подключения host1с host4помощью индекса панели (или чего-то еще), выполнив командуточно такая же командана каждой панели, вместо того чтобы вводить отдельные команды?

Примечание: все индексы начинаются с 1, но, конечно, это можно было бы сделать и без этого, например, с помощью $((...))в Bash.

решение1

Проблем немного.

  1. Для $(foo)работы fooнеобходимо вывести нужную информацию на стандартный вывод. tmux run …этого не делает; онотображаетрезультат в режиме копирования. Вы хотите tmux display -p ….

  2. tmux display -p '#{pane_index}'может дать вам полезные числа, когда вы вызываете команду панель за панелью, но в синхронизированных панелях вывод будет идентичным. Это потому, что если вы не указываете панель (с -t), то подразумевается текущая активная панель. Когда вы вызываете панель за панелью, каждый раз активна правильная панель. Когда вы вызываете в синхронизированных панелях, активна только одна панель, и ее индекс будет возвращен всеми командами.

  3. Чтобы надежно определить панель, в которой выполняется команда, используйте $TMUX_PANEпеременную окружения. В вашем случае вы не можете сделать это напрямую.

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

    Проблема в том, $TMUX_PANEчто соответствует #{pane_id}, а не #{pane_index}. Идентификаторы панелей уникальны на всем сервере tmux. Вы получите %0, %1, %2, %3для первых четырех созданных панелей. Панели, о которых идет речь, также могут дать вам %7, %8, %13, %14, если другие панели были созданы ранее и в то же время.

    Правильный способ — использовать $TMUX_PANEдля указания панели и #{pane_index}получения нужного числа.

Решение:

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

Он генерирует host0.. host3но, похоже, вы знаете, что делать, чтобы получить host1.. host4. Я решил не запутывать решение $((…)).

решение2

Вы можете использовать переменную $TMUX_PANE, которую tmux помещает в окружение каждой команды панели. Например, если вы дадите команду

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

вы увидите на каждой панели host0, или host1, и т. д. Поэтому замените echo на вашу команду ssh.

Связанный контент