Como sei o nome de uma sessão tmux?

13

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

e271p314
fonte

Respostas:

17

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 .tmux.conf, é simplesmente #S. Observe que a -popção imprimirá a mensagem no stdout, caso contrário, a mensagem será exibida na linha de status do .

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 consegui encontrar um comando para verificar, se um está dentro de uma sessão ou não, então tive que apresentar este trabalho:

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

tmux list-sessionsmostra todas as sessões, se houver uma anexada, é exibida (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 a :, o que nos deixa com o nome da sessão. Isso funciona para mim dentro e fora de uma sessão, ao contrário tmux display-message -p "#S".

Obviamente, isso funciona apenas se não houver :e não (attached)no nome da sessão.

Como comentado por Chris Johnsen , uma maneira de verificar se alguém está dentro de uma sessão é ver se sua variável de ambiente está configurada:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
pfnuesel
fonte
1
Até parece correto, tenho que admitir que não funcionou para mim. Eu tenho dois consoles, em um eu tenho a tmuxsessão e no outro estou fora da tmuxsessão. Quando digito o comando para os dois tmux display-message -p "#S", o mesmo resultado é impresso e o valor de retorno dos dois comandos é o mesmo.
e271p314
Eu vejo o mesmo comportamento. Veja minha resposta atualizada para uma solução alternativa.
precisa saber é o seguinte
4
Provavelmente, você pode simplesmente verificar a variável de ambiente TMUX (ela é normalmente definida para processos dentro de uma sessão e não fora de uma sessão - isso não é "à prova de idiotas", pois algo pode definir ou desarmar o TMUX e confundir coisas, mas deve ser razoavelmente confiável). Em ksh , bash , zsh , etc.:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen
Obrigado pelo comentário. Essa é realmente uma maneira mais elegante e robusta o suficiente, eu acho. Eu adicionei seu comentário na minha resposta.
Pfnuesel
E se eu estiver em duas sessões do tmux com nomes diferentes ao mesmo tempo? Isto funciona?
11386 Mihai Danila
0

Dê uma olhada aqui , usando este post, entendi que a única coisa que distingue os tmuxclientes é a sua, ttymas os nomes de sessão são tmuxpropriedade do servidor e é a mesma quando olhamos para o nome da sessão de dentro ou de fora de um tmuxcliente. Em seguida, podemos usar o tmux info | headque exibe o pid e tty do cliente e o pid do servidor.

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

O seguinte valor de retorno do comando é 0 se estivermos dentro de um tmuxcliente ou diferente de zero se estivermos executando fora de um tmuxcliente. Se você o estiver executando a partir de um script, certifique-se de usar 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 tmuxcliente é observando a variável de ambiente TERM. Parece que fora do cliente diz 'xterm', mas dentro diz 'tela'. No entanto, acho a primeira maneira muito melhor.

e271p314
fonte
0

Aqui está um script perl; torná-lo um script de shell ou uma função de script de shell é 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 abandonar as printinstruções e apenas usar o código de saída, se quiser usá-lo em um shell script ou algo assim.

Joe Casadonte
fonte