Як дізнатись назву сесії tmux?


13

Нещодавно я почав використовувати tmux. Мені це приємно, але у мене все ще виникають проблеми з розумінням цієї програми. Одне з основних питань, яке у мене виникає: Як дізнатися (з командного рядка), як називається tmuxсеанс, на який я ввійшов? Якщо я зареєстрований на якомусь tmuxсеансі, він підкаже мені його ім'я. Але якщо я не ввійшов до tmuxсеансу, він надрукує або нічого, або якусь помилку.

Відповіді:


18

Назва сеансу зберігається в змінній #S , для доступу до нього в ви можете це зробити

tmux display-message -p "#S"

Якщо ви хочете використовувати його в .tmux.conf, це просто #S. Зауважте, що -pопція буде надрукувати повідомлення у stdout, інакше повідомлення відображатиметься у статусу .

Якщо вищевказана команда викликається всередині сеансу, вона повертає назву сеансу. Якщо він викликається поза будь-якого сеансу, він все одно поверне ім'я останнього ще запущеного сеансу. Я не зміг знайти команду щоб перевірити, чи є вона всередині сеансу чи ні, тому мені довелося придумати цю роботу:

tmux list-sessions | sed -n '/(attached)/s/:.*//p'

tmux list-sessionsпоказує всі сеанси, якщо один додається, він відображається (attached)в кінці. За допомогою ми пригнічуємо весь вихід (варіант -n), за винятком того, де ми знаходимо ключове слово (attached), у цьому рядку ми вирізаємо кожне натискання після a :, що залишає нам назву сеансу. Це працює для мене всередині та поза сеансом, на відміну від tmux display-message -p "#S".

Звичайно, це працює лише в тому випадку, якщо в назві сеансу немає :і немає (attached).

Як коментує Кріс Джонсен , спосіб перевірити, чи є сесії це перевірити, чи встановлена ​​його змінна середовище:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"

1
Навіть це виглядає правильно, я мушу визнати, що це не працювало для мене. У мене дві консолі, в одній я tmuxсеанс, а в іншій я поза tmuxсеансом. Коли я ввожу в обох команду tmux display-message -p "#S", друкується один і той же результат, а значення, що повертається для обох команд, однакове.
e271p314

Я бачу таку саму поведінку. Подивіться на мою оновлену відповідь для роботи.
pfnuesel

4
Ви, ймовірно, можете просто уникнути перевірки змінної середовища TMUX (вона зазвичай встановлюється для процесів всередині сеансу, а не встановлюється поза сеансом - це не є "дурним доказом", оскільки щось може встановити або вимкнути TMUX і заплутати речі, але він повинен бути досить надійним). In ksh , bash , zsh , et cetera:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Кріс Джонсен

Дякуємо за коментар Це дійсно більш елегантний спосіб і досить надійний, я вважаю. Я додав ваш коментар у свою відповідь.
pfnuesel

Що робити, якщо я перебуваю в двох сеансах tmux одночасно з різними іменами? Це працює?
Mihai Danila

0

Подивіться тут , використовуючи цю публікацію, я зрозумів, що одне, що відрізняє tmuxклієнтів, - це те, що вони, ttyале назви сесії - це tmuxвластивість сервера, і це те саме, коли ми дивимось ім'я сесії всередині або зовні tmuxклієнта. Далі ми можемо використовувати, tmux info | headякий відображає pid та tty клієнта та pid сервера.

tmux info | grep $$ | grep -q `ps -p $$ -o tty=`

Наступне значення повернення команди 0, якщо ми знаходимось у tmuxклієнті або не дорівнює нулю, якщо ми працюємо поза tmuxклієнтом. Якщо ви запускаєте його зі сценарію, переконайтеся, що ви використовуєте ppid замість $$, оскільки tty асоційований із процесом оболонки, а не із сценарієм, який ви виконуєте.

Один простий спосіб, але менш надійний, щоб дізнатися, чи знаходимось ми всередині або поза tmuxклієнтом, - переглянувши змінну середовища TERM. Здається, що поза клієнтом він пише "xterm", а всередині - "screen". Однак я вважаю перший спосіб набагато кращим.


0

Ось сценарій perl; зробити його скриптом оболонки або функцією скрипту оболонки - це вправа, яка залишається читачеві.

#!/opt/local/bin/perl

use strict;
use warnings;

if (exists $ENV{'TMUX'}) {
    # session ID is the last element
    # /tmp/1s/ffkjhk76sdgn/T/tmux-771/default,16772,8
    my($id) = $ENV{'TMUX'};
    $id =~ s{^.*,(\d+)$}{$1};

    # get session name
    my($cmd) = q(tmux ls -F "#{session_name}: #{session_id}");
    open(IN, "$cmd |") || die qq([ERROR] Cannot open pipe from "$cmd" - $!\n);

    while (<IN>) {
        chomp;

        if (m{(^.*):\s+\$$id$}) {
            print "Session name: <$1>\n";
            exit 0;
        }
    }

    print "Unable to determine TMUX session name\n";
    exit 1;
}
else {
    print "Not in a TMUX session\n";

    exit 1;
}

Це дає наступний вихід у сеансі TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

Поза сеансом TMUX він створював би наступне:

<~> $ tmuxsessionname
Not in a TMUX session

Ви можете викопати printвисловлювання і просто використовувати код виходу, якщо ви хочете використовувати це в скрипті оболонки чи щось.

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