Como sei o nome da sessão atual do tmux, executando o comando tmux


34

Estou escrevendo um roteiro. Eu realmente quero saber disso. Espero que o executável do tmux possa me dizer isso.

eu acho

tmux rename <newname>

pode renomear a sessão atual. Mas não consigo encontrar um comando para buscar seu próprio nome.

Respostas:


49

Com o tmux 1.2 (e posterior), você pode usar a -popção de display-messageenviar uma mensagem para o stdout (em vez de exibi-la para um cliente conectado):

tmux display-message -p '#S'

#Sestá formatado como o nome da sessão (consulte a descrição da status-leftopção na página de manual).


+1, muito melhor que a minha resposta.
chepner

Eu realmente aprecio que você aponte que ele requer o tmux 1.2, que é exatamente a versão disponível para a atualização on-line automática do openSUSE 11.3.
Jimm Chen

Com o tmux 1.8, isso retorna o nome de uma sessão anexada, mesmo quando não estou trabalhando nessa sessão.
11386 Mihai Danila

A resposta de Tim People abaixo trabalha com o tmux 1.8 e posterior, além de abordar os pontos que ele levanta. Essa é a melhor resposta.
Alexandros

8

Estou surpreso que, após quase 5 anos, ninguém apontou que nenhuma dessas respostas é adequada. Enquanto os dois funcionam bem, desde que o TTY atual esteja anexado à única sessão do tmux no host, essas respostas ficam fracas se:

  1. a sessão atual do terminal não faz parte de uma sessão tmux ou
  2. existem várias sessões tmux anexadas

No primeiro caso, as duas respostas aqui relatam o nome da sessão anexada (independentemente de o tty atual ser governado por essa sessão). Neste último caso, o resultado é provavelmente indeterminado ou resultará em várias respostas.

A pergunta correta deve ser: "Qual é o nome da sessão tmux à qual minha sessão de terminal atual está anexada?"

Para ele responder a essa pergunta, execute:

for s in $(tmux list-sessions -F '#{session_name}'); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$(tty)" | awk '{print $2}'

Isso funciona independentemente do número de sessões tmux (anexadas ou não) e independentemente de a sessão atual do terminal ser ou não parte de uma sessão tmux.


11
Ótima resposta. Em vez de percorrer o nome de cada sessão para listar seus painéis, você também pode usar tmux list-panes -a -F '#{pane_tty} #{session_name}'para listar os painéis de todas as sessões. Não tenho certeza de quão novo -aé, então YMMV.
Brian Cline

Volte a esta pergunta depois de usar a resposta aceita e falhar conforme os problemas descritos aqui. Voto por favor. Se possível, a resposta aceita deve ser alterada.
Alexandros

11
O método 1 funciona bem se combinado à verificação da TMUXvariável de ambiente antes da execução tmux display-message -p '#S'de uma instalação típica da área de trabalho.
ZeroPhase

8

Extensão / corrigido resposta de Tim-povos conforme o comentário de don_crissti on Porque é que este grep -vnão está funcionando como esperado? .

Comando "$ (tty)" na resposta dos tim-people

| grep "$ (tty)" |

não funcionaria nesse contexto conforme o esperado. Ele avalia como uma string 'não um tty'.

Substituí-lo por uma variável resolve esse problema.

tty = $ (tty)

...

| grep "$ tty" |

Além disso, quando não existem sessões tmux, o código original produziria

Mensagem de erro "nenhum servidor em execução no / tmp / tmux-1000 / default" .

Adicione 2>/dev/nulle o código seria executado sem imprimir a mensagem de erro.

O código modificado é lido como:

tty=$(tty)
for s in $(tmux list-sessions -F '#{session_name}' 2>/dev/null); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$tty" | awk '{print $2}'

11
Qual é a melhoria? Se for necessário, você deve enviá-lo como uma edição e não como uma resposta. Para torná-la uma boa resposta, você provavelmente deve considerar incluir um texto mais descritivo.
Seth #

11
@ seth, eu queria comentar, mas estranhamente não tinha crédito suficiente para fazê-lo.
lado bom

Você precisa de 50 reputação para comentar . Geralmente, não é uma boa ideia comentar com código complexo, pois você não tem quebras de linha e assim por diante. Sua edição tornou uma boa resposta IMHO.
Seth

Oh, entendi agora. A questão "tty" é uma coisa bash. Eu não uso essa concha de brinquedo: D
Tim Peoples

11
@TimPeoples Embora possa ser um problema do Bash. O Bash ainda é o padrão para codificar scripts de shell para compatibilidade nos terminais modernos. Certamente, o padrão posix é ideal; mas, o bash possui alguns recursos que todos os terminais mais avançados compartilham. Ao bater no Bash, a maioria dos outros principais terminais deve funcionar. Acabei de executar a verificação do shell e pego vários erros incorretos e problemas de formatação. (principalmente usando sintaxe antiga no lugar da sintaxe mais descritiva atual)
ZeroPhase

4
  • A resposta de Chris Johnsen retorna um nome de sessão, mesmo ao consultar de fora de uma.
  • A resposta do lado positivo e do Tim Peoples pressupõe a tty.

Em vez disso, achei que isso funcionava corretamente para mim:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi

3

Não é o ideal, mas você pode extrair o nome da sessão anexada com awk:

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

O formato personalizado é um pouco mais fácil de analisar do que o padrão.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.