Comment connaître le nom d'une session tmux?

13

Récemment, j'ai commencé à utiliser tmux. Je le trouve sympa, mais j'ai toujours des problèmes pour comprendre cette application. L'une des questions fondamentales que je me pose est la suivante: comment savoir (à partir de la ligne de commande) quel est le nom de la tmuxsession à laquelle je suis connecté? Si je suis connecté à une tmuxsession, il me dira son nom. Mais si je ne suis pas connecté à une tmuxsession, cela n'imprimera rien ou une sorte d'erreur.

e271p314
la source

Réponses:

18

Le nom de la session est stocké dans la variable #S , pour y accéder dans un , vous pouvez faire

tmux display-message -p "#S"

Si vous voulez l'utiliser .tmux.conf, c'est tout simplement #S. Notez que l' -poption imprimera le message sur stdout, sinon le message s'affiche dans la ligne d'état .

Si la commande ci-dessus est appelée dans une session, elle renvoie le nom de la session. S'il est appelé en dehors d'une session, il renvoie toujours le nom de la dernière session en cours d'exécution. Je n'ai pas pu trouver une commande pour vérifier, si une est à l'intérieur d'une session ou non, j'ai donc dû trouver cette :

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

tmux list-sessionsaffiche toutes les sessions, si une est jointe, elle s'affiche (attached)à la fin. Avec nous supprimons toutes les sorties (option -n) sauf là où nous trouvons le mot-clé (attached), sur cette ligne, nous supprimons tout après un :, ce qui nous laisse le nom de la session. Cela fonctionne pour moi à l'intérieur et à l'extérieur d'une session, par opposition à tmux display-message -p "#S".

Bien sûr, cela ne fonctionne que s'il n'y a pas :et non (attached)au nom de la session.

Comme l'a commenté Chris Johnsen , un moyen de vérifier si l'on se trouve dans une session est de voir si sa variable d'environnement est définie:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
pfnuesel
la source
1
Même si cela semble correct, je dois admettre que cela n'a pas fonctionné pour moi. J'ai deux consoles, dans l'une j'ai la tmuxsession et dans l'autre je suis en dehors de la tmuxsession. Lorsque je tape la commande dans les deux tmux display-message -p "#S", le même résultat est imprimé et la valeur de retour des deux commandes est la même.
e271p314
Je vois le même comportement. Regardez ma réponse mise à jour pour un contourner.
pfnuesel
4
Vous pouvez probablement vous contenter de vérifier la variable d'environnement TMUX (elle est normalement définie pour les processus à l'intérieur d'une session, et non définie en dehors d'une session - ce n'est pas «à toute épreuve», car quelque chose peut définir ou annuler TMUX et confondre les choses, mais il devrait être assez fiable). En ksh , bash , zsh , et cetera:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen
Merci pour le commentaire. C'est en effet une manière plus élégante et suffisamment robuste, je pense. J'ai ajouté votre commentaire dans ma réponse.
pfnuesel
Que faire si je suis à l'intérieur de deux sessions tmux avec des noms différents en même temps? Est-ce que ça marche?
Mihai Danila
0

Jetez un oeil ici , en utilisant ce post, j'ai compris que la seule chose qui distingue les tmuxclients est leur ttymais les noms de session sont la tmuxpropriété du serveur et sont les mêmes lorsque nous regardons le nom de la session de l'intérieur ou de l'extérieur d'un tmuxclient. Ensuite, nous pouvons utiliser tmux info | headqui affiche le pid et tty du client et le pid du serveur.

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

La valeur de retour de commande suivante est 0 si nous sommes à l'intérieur d'un tmuxclient ou non nulle si nous fonctionnons à l'extérieur d'un tmuxclient. Si vous l'exécutez à partir d'un script, assurez-vous d'utiliser ppid au lieu de $$ car le tty est associé au processus shell et non au script que vous exécutez.

Une manière simple mais moins robuste de savoir si nous sommes à l'intérieur ou à l'extérieur du tmuxclient est de regarder la variable d'environnement TERM. Il semble qu'à l'extérieur du client, il est dit «xterm», mais à l'intérieur, il dit «écran». Cependant, je trouve le premier moyen bien meilleur.

e271p314
la source
0

Voici un script perl; en faire un script shell ou une fonction de script shell est un exercice laissé au lecteur.

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

Cela produit la sortie suivante dans une session TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

En dehors d'une session TMUX, cela produirait les éléments suivants:

<~> $ tmuxsessionname
Not in a TMUX session

Vous pouvez abandonner les printinstructions et utiliser simplement le code de sortie si vous souhaitez l'utiliser dans un script shell ou quelque chose.

Joe Casadonte
la source