Как узнать текущее имя сеанса tmux, запустив команду tmux

34

Я пишу сценарий. Я действительно хочу это знать. Я надеюсь, что исполняемый файл tmux скажет мне это.

я нахожу

tmux rename <newname>

Можно переименовать текущую сессию. Но я не могу найти команду, чтобы получить свое собственное имя.

Джимм Чен
источник

Ответы:

49

В tmux 1.2 (и более поздних версиях) вы можете использовать -pопцию display-messageдля вывода сообщения на стандартный вывод (вместо отображения его на подключенном клиенте):

tmux display-message -p '#S'

#Sформатируется как имя сеанса (см. описание status-leftопции на странице руководства).

Крис Джонсен
источник
+1, намного лучше, чем мой ответ.
Chepner
Я действительно ценю, что вы указали, что для этого требуется tmux 1.2, который является именно той версией, которая доступна для автоматического онлайн-обновления openSUSE 11.3.
Джимм Чен
С tmux 1.8 это возвращает имя присоединенного сеанса, даже когда я не работаю в этом сеансе.
Михай Данила
Ответ Tim People ниже работает с tmux 1.8 и более поздними версиями, а также касается вопросов, которые он поднимает. Это лучший ответ.
Александрос
8

Я удивлен, что спустя почти 5 лет никто не указал, что ни один из этих ответов не является адекватным. Хотя оба работают нормально, если текущий TTY подключен к единственному сеансу tmux на хосте, оба эти ответа не срабатывают, если:

  1. текущий сеанс терминала не является частью сеанса tmux, или
  2. Есть несколько подключенных сеансов tmux

В первом случае оба ответа здесь сообщают имя присоединенного сеанса (независимо от того, управляется ли текущий tty этим сеансом). В последнем случае результат может быть неопределенным или приведет к множественным ответам.

Правильный вопрос должен звучать так: «Как называется сеанс tmux, к которому присоединен мой текущий сеанс терминала?»

Чтобы он ответил на этот вопрос, выполните:

for s in $(tmux list-sessions -F '#{session_name}'); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$(tty)" | awk '{print $2}'

Это работает независимо от количества сеансов tmux (подключенных или иных) и независимо от того, является ли текущий сеанс терминала частью сеанса tmux или нет.

Тим Пиплс
источник
1
Отличный ответ. Вместо того, чтобы циклически проходить по каждому имени сеанса для отображения его панелей, вы также можете использовать tmux list-panes -a -F '#{pane_tty} #{session_name}'для перечисления панелей каждого сеанса. Не уверен, что нового -a, так что YMMV.
Брайан Клайн
Вернулся к этому вопросу после использования принятого ответа и сбоя в соответствии с вопросами, описанными здесь. Пожалуйста, проголосуйте за это. Если возможно, принятый ответ должен быть изменен.
Александрос
1
Метод 1 работает нормально, если его объединить с проверкой TMUXпеременной среды перед запуском tmux display-message -p '#S'для типичной настройки рабочего стола.
ZeroPhase
8

Extended / исправленный ответ ТИМ-народов игровая согласно don_crissti свой комментарий на Почему это grep -vне работает , как ожидалось? ,

Команда "$ (tty)" в ответе tim-people

| grep "$ (tty)" |

не будет работать в этом контексте, как ожидалось. Он оценивает строку «не tty».

Замена на переменную решает эту проблему.

TTY = $ (терминал)

...

| grep "$ tty" |

Кроме того, когда нет сеансов tmux, оригинальный код будет производить

Сообщение об ошибке «сервер не работает в / tmp / tmux-1000 / default» .

Добавьте 2>/dev/nullи код будет работать без вывода сообщения об ошибке.

Модифицированный код читается как:

tty=$(tty)
for s in $(tmux list-sessions -F '#{session_name}' 2>/dev/null); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$tty" | awk '{print $2}'
хорошая сторона
источник
1
В чем улучшение? Если это необходимо, вы должны представить его как редактирование, а не как ответ. Чтобы сделать это хорошим ответом, вы, вероятно, должны рассмотреть возможность включения более описательного текста.
Сет
1
@seth, я хотел прокомментировать, но, как ни странно, у меня не было достаточно кредитов, чтобы сделать это.
светлая сторона
Вам нужно 50 репутации, чтобы комментировать . Обычно не рекомендуется комментировать сложный код, так как вам не хватает разрывов строк и так далее. Ваше редактирование сделало это довольно хорошим ответом ИМХО.
Сет
О, теперь я понял. Проблема "tty" - вещь, связанная с bash. Я не использую эту игрушечную скорлупу: D
Тим
1
@TimPeoples Хотя это может быть проблемой Bash. Bash по-прежнему является стандартом для кодирования сценариев оболочки для совместимости на современных терминалах. Конечно, стандарт posix идеален; но у bash есть некоторые особенности, которыми обладают все более продвинутые терминалы. При нажатии на Bash большинство других крупных терминалов должны просто работать. Я просто запускаю проверку оболочки и выявляю кучу ошибок и проблем с форматированием. (в основном используется старый синтаксис вместо текущего более описательного синтаксиса)
ZeroPhase
4
  • Ответ Криса Джонсена возвращает имя сеанса даже при запросе извне.
  • Светлая сторона и ответ Тима Народа предполагают a tty.

Вместо этого я обнаружил, что это работает точно для меня:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi
dset0x
источник
3

Не идеально, но вы можете извлечь имя прикрепленного сеанса с помощью awk:

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

Пользовательский формат немного легче разобрать, чем стандартный.

chepner
источник