Як дізнатися поточне ім'я сесії tmux, виконавши команду tmux


34

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

я знайшов

tmux rename <newname>

може перейменувати поточний сеанс. Але я не можу знайти команду отримати власне ім’я.

Відповіді:


49

За допомогою tmux 1.2 (і пізніших версій) ви можете використовувати -pопцію display-messageдля виведення повідомлення в stdout (замість того, щоб показувати його приєднаному клієнту):

tmux display-message -p '#S'

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


+1, набагато краще, ніж моя відповідь.
чепнер

Я дуже вдячний, що ви зазначаєте, що потрібен tmux 1.2, саме така версія доступна для автоматичного оновлення openSUSE 11.3 в Інтернеті.
Джимм Чен

З tmux 1.8 це повертає назву доданого сеансу, навіть коли я не працюю на цьому сеансі.
Mihai Danila

Відповідь Тіма Людина нижче працює з 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)" у відповіді тимчасових людей

| grep "$ (tty)" |

не працюватиме в цьому контексті, як очікувалося. Він оцінює рядок "не tty".

Заміна його змінною вирішує цю проблему.

tty = $ (tty)

...

| grep "$ tty" |

Крім того, коли не існує сеансів tmux, оригінальний код створює

Повідомлення про помилку "немає сервера, що працює на / tmp / tmux-1000 / за замовчуванням" .

Додавання, 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" - це суттєва річ. Я не використовую цю іграшкову оболонку: D
Tim Peoples

1
@TimPeoples Хоча це може бути проблема Bash. Bash все ще є стандартом для кодування скриптів оболонки для сумісності на сучасних терміналах. Впевнений, стандарт позі - ідеальний; але, bash має деякі функції, якими користуються всі більш вдосконалені термінали. При натисканні на Bash більшість інших великих терміналів повинні просто працювати. Я просто запускаю перевірку оболонки і виявляю купу поганих помилок та проблем із форматуванням. (переважно використовують старий синтаксис замість поточного більш описового синтаксису)
ZeroPhase

4
  • Відповідь Кріса Джонсена повертає ім’я сеансу, навіть коли проводиться запит із-за меж одного.
  • світла сторона - х і відповідь Тім Народів припустити tty.

Натомість я виявив, що це працює для мене точно:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi

3

Не ідеально, але ви можете отримати назву доданого сеансу за допомогою awk:

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

Спеціальний формат трохи простіше розбирати, ніж за замовчуванням.

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