Woher weiß ich den Namen einer tmux-Sitzung?

13

Seit kurzem benutze ich tmux. Ich finde es schön, aber ich habe immer noch Probleme, diese Anwendung zu verstehen. Eine der grundlegenden Fragen, die ich habe, lautet: Woher weiß ich (von der Befehlszeile aus), wie der Name der tmuxSitzung lautet, in der ich angemeldet bin? Wenn ich zu einer tmuxSitzung angemeldet bin , wird mir der Name mitgeteilt. Wenn ich jedoch nicht an einer tmuxSitzung angemeldet bin , wird entweder nichts oder ein Fehler ausgegeben.

e271p314
quelle

Antworten:

17

Der Name der Sitzung wird in der Variablen gespeichert #S, auf die Sie in einem zugreifen können

tmux display-message -p "#S"

Wenn Sie es verwenden möchten .tmux.conf, ist es einfach #S. Beachten Sie, dass die -pOption die Nachricht auf stdout druckt, andernfalls wird die Nachricht in der angezeigt .

Wenn der obige Befehl in einer Sitzung aufgerufen wird, gibt er den Namen der Sitzung zurück. Wenn es außerhalb einer Sitzung aufgerufen wird, wird weiterhin der Name der zuletzt noch ausgeführten Sitzung zurückgegeben. Ich konnte keinen Befehl finden, mit dem überprüfen konnte, ob sich einer in einer Sitzung befindet oder nicht. ich folgende finden :

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

tmux list-sessionsZeigt alle Sessions an, wenn eine angehängt ist, wird diese (attached)am Ende angezeigt. Mit unterdrücken wir alle Ausgaben (Option -n), außer wo wir das Schlüsselwort (attached)finden. In dieser Zeile schneiden wir nach a alles weg :, was uns den Namen der Sitzung gibt. Dies funktioniert bei mir innerhalb und außerhalb einer Sitzung im Gegensatz zu tmux display-message -p "#S".

Dies funktioniert natürlich nur, wenn im Namen der Sitzung kein :und kein vorhanden ist (attached).

Wie von Chris Johnsen kommentiert , besteht eine Möglichkeit, zu überprüfen, ob sich eine in einer Sitzung befindet , darin, zu überprüfen , ob die Umgebungsvariable gesetzt ist:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
pfnuesel
quelle
1
Auch wenn es richtig aussieht, muss ich zugeben, dass es bei mir nicht funktioniert hat. Ich habe zwei Konsolen, in einer habe ich die tmuxSitzung und in der anderen bin ich außerhalb der tmuxSitzung. Wenn ich tmux display-message -p "#S"beide Befehle eingebe , wird das gleiche Ergebnis gedruckt und der Rückgabewert beider Befehle ist der gleiche.
e271p314
Ich sehe das gleiche Verhalten. Schauen Sie sich meine aktualisierte Antwort für eine Lösung an.
Pfnüsel
4
Sie können wahrscheinlich einfach die TMUX-Umgebungsvariable überprüfen (sie ist normalerweise für Prozesse innerhalb einer Sitzung und nicht außerhalb einer Sitzung festgelegt - dies ist kein "narrensicher", da etwas TMUX festlegen oder deaktivieren und die Dinge verwirren könnte). aber es sollte ziemlich zuverlässig sein). In ksh , bash , zsh , und so weiter:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen
Danke für den Kommentar. Das ist in der Tat eleganter und robust genug, denke ich. Ich habe Ihren Kommentar zu meiner Antwort hinzugefügt.
Pfnuesel
Was ist, wenn ich in zwei tmux-Sessions mit unterschiedlichen Namen gleichzeitig bin? Funktioniert das?
Mihai Danila
0

Werfen Sie einen Blick hier , mit diesem Beitrag habe ich verstanden , dass das Einzige , was die unterscheidet tmuxKunden die ihre ist ttyaber Sitzungsnamen sind tmuxServereigenschaft und ist das gleiche , wenn wir auf der Sitzung Namen von innerhalb oder außerhalb eines aussehen tmuxClient. Als nächstes können wir verwenden, tmux info | headwas die PID und Tty des Clients und die PID des Servers anzeigt.

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

Der folgende Befehlsrückgabewert ist 0, wenn wir uns innerhalb eines tmuxClients befinden, oder ungleich Null, wenn wir außerhalb eines tmuxClients ausgeführt werden. Wenn Sie es über ein Skript ausführen, stellen Sie sicher, dass Sie ppid anstelle von $$ verwenden, da das tty dem Shell-Prozess zugeordnet ist und nicht dem Skript, das Sie ausführen.

Eine einfache, aber weniger robuste Methode, um zu wissen, ob wir innerhalb oder außerhalb des tmuxClients sind, besteht darin, die Umgebungsvariable TERM zu untersuchen. Es scheint, dass außerhalb des Clients "xterm" steht, innerhalb "screen". Allerdings finde ich den ersten Weg viel besser.

e271p314
quelle
0

Hier ist ein Perl-Skript; es zu einem Shell-Skript oder einer Shell-Skript-Funktion zu machen, ist eine Aufgabe, die dem Leser überlassen bleibt.

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

Dies erzeugt die folgende Ausgabe in einer TMUX-Sitzung:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

Außerhalb einer TMUX-Sitzung würde Folgendes erzeugt:

<~> $ tmuxsessionname
Not in a TMUX session

Sie können die printAnweisungen verwerfen und einfach den Exit-Code verwenden, wenn Sie dies in einem Shell-Skript oder so etwas verwenden möchten.

Joe Casadonte
quelle