Como sei o nome de uma sessão tmux?

12

Recentemente, comecei a usar tmux . Acho legal, mas ainda estou tendo problemas para entender esse aplicativo. Uma das perguntas básicas que tenho é: Como eu sei (na linha de comando) qual é o nome da sessão tmux na qual estou logado? Se eu estiver logado em alguma sessão de tmux , ele me dirá seu nome. Mas se eu não estiver logado em uma sessão tmux , ele imprimirá nada ou algum tipo de erro.

    
por e271p314 28.01.2014 / 18:53

3 respostas

15

O nome da sessão é armazenado na variável #S , para acessá-lo em um , você pode fazer

tmux display-message -p "#S"

Se você quiser usá-lo em .tmux.conf , é simplesmente #S . Observe que a opção -p imprimirá a mensagem no stdout, caso contrário, a mensagem será exibida na tag .

Se o comando acima for chamado dentro de uma sessão, ele retornará o nome da sessão. Se for chamado fora de qualquer sessão, ainda retornará o nome da última sessão ainda em execução. Não foi possível encontrar um comando para verificar se um deles está dentro de um sessão ou não, então eu tive que vir com este trabalho em torno de:

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

tmux list-sessions mostra todas as sessões, se uma estiver anexada, mostra (attached) no final. Com suprimimos toda a saída (opção -n ) exceto onde encontramos a palavra-chave (attached) , nessa linha, cortamos tudo depois de um : , o que nos deixa com o nome da sessão. Isso funciona para mim dentro e fora de uma sessão, ao contrário de tmux display-message -p "#S" .

Claro que isso funciona somente se não houver : e não (attached) no nome da sessão.

Como comentado por Chris Johnsen , uma maneira de verificar se um está dentro de um é ver se sua variável de ambiente está definida:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
    
por 28.01.2014 / 18:57
0

Dê uma olhada aqui , Usando este post eu entendi que a única coisa que distingue os clientes tmux é o seu tty , mas os nomes das sessões são tmux server e é o mesmo quando olhamos para o nome da sessão dentro ou fora de um tmux cliente. Em seguida, podemos usar tmux info | head , que exibe o pid e tty do cliente e o pid do servidor.

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

O valor de retorno do comando a seguir é 0 se estivermos dentro de um tmux client ou diferente de zero se estivermos executando fora de um tmux client. Se você estiver executando-o a partir de um script, certifique-se de usar o ppid em vez de $$, pois o tty está associado ao processo do shell e não ao script que você está executando.

Uma maneira fácil, mas menos robusta, de saber se estamos dentro ou fora do tmux client é observar a variável de ambiente TERM. Parece que fora do cliente diz 'xterm' mas dentro dele diz 'screen'. No entanto, acho a primeira maneira muito melhor.

    
por 29.01.2014 / 18:28
0

Aqui está um script perl; fazer disso um script de shell ou uma função de shell script é um exercício deixado para o leitor.

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

Isso produz a seguinte saída em uma sessão do TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

Fora de uma sessão do TMUX, ele produziria o seguinte:

<~> $ tmuxsessionname
Not in a TMUX session

Você pode eliminar as instruções print e apenas usar o código de saída se quiser usá-lo em um script de shell ou algo assim.

    
por 30.01.2014 / 03:45

Tags