¿Cómo sé el nombre de una sesión tmux?

13

Recientemente, comencé a usar tmux. Me parece agradable, pero todavía tengo problemas para entender esta aplicación. Una de las preguntas básicas que tengo es: ¿Cómo sé (desde la línea de comandos) cuál es el nombre de la tmuxsesión en la que estoy conectado? Si he iniciado sesión en alguna tmuxsesión, me dirá su nombre. Pero si no estoy conectado a una tmuxsesión, no imprimirá nada o algún tipo de error.

e271p314
fuente

Respuestas:

18

El nombre de la sesión se almacena en la variable #S , para acceder a ella en un , puede hacer

tmux display-message -p "#S"

Si quieres usarlo .tmux.conf, es simplemente #S. Tenga en cuenta que la -popción imprimirá el mensaje en stdout; de lo contrario, el mensaje se mostrará en la línea de estado de .

Si se llama al comando anterior dentro de una sesión, devuelve el nombre de la sesión. Si se llama fuera de cualquier sesión, aún devuelve el nombre de la última sesión en ejecución. No pude encontrar un comando para verificar, si uno está dentro de una sesión o no, así que tuve que idear esta solución:

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

tmux list-sessionsmuestra todas las sesiones, si hay una adjunta, se muestra (attached)al final. Con , suprimimos toda la salida (opción -n) excepto donde encontramos la palabra clave (attached), en esta línea cortamos todo después de un :, lo que nos deja con el nombre de la sesión. Esto funciona para mí dentro y fuera de una sesión, a diferencia de tmux display-message -p "#S".

Por supuesto, esto funciona solo si no hay :y no (attached)en el nombre de la sesión.

Como comentó Chris Johnsen , una forma de verificar si uno está dentro de una sesión es ver si su variable de entorno está configurada:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
pfnuesel
fuente
1
Incluso si parece correcto, debo admitir que no funcionó para mí. Tengo dos consolas, en una tengo la tmuxsesión y en la otra estoy fuera de la tmuxsesión. Cuando escribo en ambos el comando tmux display-message -p "#S", se imprime el mismo resultado y el valor de retorno de ambos comandos es el mismo.
e271p314
Veo el mismo comportamiento. Mira mi respuesta actualizada para una solución alternativa.
pfnuesel
44
Probablemente pueda salirse con la suya buscando la variable de entorno TMUX (normalmente está configurada para procesos dentro de una sesión y no configurada fuera de una sesión; esto no es "infalible", ya que algo puede configurar o desarmar TMUX y confundir las cosas, pero debería ser bastante confiable). En ksh , bash , zsh , etcétera:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen
Gracias por el comentario. De hecho, creo que es una forma más elegante y lo suficientemente robusta. Agregué tu comentario en mi respuesta.
pfnuesel
¿Qué sucede si estoy dentro de dos sesiones de tmux con diferentes nombres al mismo tiempo? ¿Esto funciona?
Mihai Danila
0

Eche un vistazo aquí , usando esta publicación, entendí que lo único que distingue a los tmuxclientes son sus ttynombres de sesión, pero son tmuxpropiedad del servidor y es lo mismo cuando miramos el nombre de la sesión desde dentro o fuera de un tmuxcliente. A continuación, podemos usar el tmux info | headque muestra el pid y tty del cliente y el pid del servidor.

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

El siguiente valor de retorno del comando es 0 si estamos dentro de un tmuxcliente o no cero si estamos ejecutando fuera de un tmuxcliente. Si lo está ejecutando desde un script, asegúrese de usar ppid en lugar de $$ ya que tty está asociado con el proceso de shell y no con el script que está ejecutando.

Una manera fácil pero menos robusta de saber si estamos dentro o fuera del tmuxcliente es mirar la variable de entorno TERM. Parece que fuera del cliente dice 'xterm' pero dentro dice 'pantalla'. Sin embargo, la primera forma me parece mucho mejor.

e271p314
fuente
0

Aquí hay un script perl; convertirlo en un script de shell o una función de script de shell es un ejercicio que le queda al lector.

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

Esto produce el siguiente resultado en una sesión TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

Fuera de una sesión TMUX produciría lo siguiente:

<~> $ tmuxsessionname
Not in a TMUX session

Puede deshacerse de las printdeclaraciones y simplemente usar el código de salida si desea usar esto en un script de shell o algo así.

Joe Casadonte
fuente