Jak poznać nazwę sesji Tmux?

13

Ostatnio zacząłem używać tmux. Uważam to za miłe, ale wciąż mam problemy ze zrozumieniem tej aplikacji. Jedno z podstawowych moich pytań brzmi: skąd mam wiedzieć (z wiersza poleceń), jak nazywa się tmuxsesja, do której jestem zalogowany? Jeśli jestem zalogowany do jakiejś tmuxsesji, poda mi swoją nazwę. Ale jeśli nie jestem zalogowany do tmuxsesji, wydrukuje albo nic, albo jakiś błąd.

e271p314
źródło

Odpowiedzi:

18

Nazwa sesji jest przechowywana w zmiennej #S , aby uzyskać do niej dostęp w , możesz to zrobić

tmux display-message -p "#S"

Jeśli chcesz go użyć .tmux.conf, to po prostu #S. Zauważ, że -popcja wypisze wiadomość na standardowe wyjście, w przeciwnym razie wiadomość zostanie wyświetlona w linii statusu .

Jeśli powyższe polecenie zostanie wywołane w ramach sesji, zwróci nazwę sesji. Jeśli zostanie wywołany poza dowolną sesją, nadal zwróci nazwę ostatniej wciąż działającej sesji. Nie mogłem znaleźć komendy do sprawdzenia, czy jest ona w sesji, czy nie, więc musiałem wymyślić tę pracę:

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

tmux list-sessionspokazuje wszystkie sesje, jeśli jedna jest dołączona, pokazuje (attached)na końcu. Za pomocą pomijamy wszystkie dane wyjściowe (opcję -n) oprócz tego, gdzie znajdujemy słowo kluczowe (attached), w tym wierszu odcinamy wszystko po znaku :, co pozostawia nam nazwę sesji. W przeciwieństwie do mnie działa to w sesji i poza nią tmux display-message -p "#S".

Oczywiście działa to tylko wtedy, gdy w nazwie sesji nie ma ani :nie (attached).

Jak skomentował Chris Johnsen , sposobem sprawdzenia, czy ktoś jest w sesji jest sprawdzenie, czy ustawiona jest jego zmienna środowiskowa:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
pfnuesel
źródło
1
Nawet jeśli wygląda to poprawnie, muszę przyznać, że nie działało to dla mnie. Mam dwie konsole, w jednej mam tmuxsesję, aw drugiej jestem poza tmuxsesją. Kiedy wpisuję oba z nich tmux display-message -p "#S", drukowany jest ten sam wynik, a zwracana wartość obu poleceń jest taka sama.
e271p314
Widzę to samo zachowanie. Spójrz na moją zaktualizowaną odpowiedź na obejście.
pfnuesel
4
Prawdopodobnie możesz po prostu uniknąć sprawdzania zmiennej środowiskowej TMUX (zwykle jest ona ustawiana dla procesów wewnątrz sesji i nie ustawiana poza sesją - nie jest to „głupi dowód”, ponieważ coś może ustawić lub rozbroić TMUX i dezorientować rzeczy, ale powinna być dość niezawodna). W ksh , bash , zsh i tak dalej:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen
Dziękuję za komentarz. Sądzę, że to rzeczywiście bardziej elegancki i wystarczająco solidny sposób. Dodałem twój komentarz do mojej odpowiedzi.
pfnuesel
Co jeśli będę w trakcie dwóch sesji tmux o różnych nazwach jednocześnie? czy to działa?
Mihai Danila,
0

Spójrz tutaj , korzystając z tego postu zrozumiałem, że jedyną rzeczą, która wyróżnia tmuxklientów, jest to, ttyże nazwy sesji są tmuxwłasnością serwera i są takie same, gdy patrzymy na nazwę sesji od wewnątrz lub na zewnątrz tmuxklienta. Następnie możemy użyć, tmux info | headktóry wyświetla pid i tty klienta oraz pid serwera.

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

Następująca wartość zwracana przez komendę to 0, jeśli jesteśmy w tmuxkliencie, lub niezerowa, jeśli działamy poza tmuxklientem. Jeśli uruchamiasz go ze skryptu, upewnij się, że używasz ppid zamiast $$, ponieważ tty jest powiązany z procesem powłoki, a nie z uruchomionym skryptem.

Jednym prostym sposobem, ale mniej niezawodnym, aby dowiedzieć się, czy jesteśmy tmuxklientem wewnętrznym, czy zewnętrznym, jest sprawdzenie zmiennej środowiskowej TERM. Wygląda na to, że poza klientem mówi „xterm”, ale wewnątrz mówi „ekran”. Jednak uważam, że pierwszy sposób jest znacznie lepszy.

e271p314
źródło
0

Oto skrypt perla; uczynienie z niego skryptu powłoki lub funkcji skryptu powłoki jest ćwiczeniem pozostawionym czytelnikowi.

#!/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;
}

Daje to następujące dane wyjściowe w sesji TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

Poza sesją TMUX wygenerowałoby to:

<~> $ tmuxsessionname
Not in a TMUX session

Możesz porzucić printinstrukcje i po prostu użyć kodu wyjścia, jeśli chcesz użyć tego w skrypcie powłoki lub coś takiego.

Joe Casadonte
źródło