Como iniciar o tmux com o anexo se houver uma sessão

92

Se eu usar

tmux attach

Posso anexar a uma sessão em execução, mas se não houver uma sessão em execução, só recebo o erro

no sessions

Como posso iniciar automaticamente uma nova sessão se não houver nenhuma em execução? algo como

tmux attach-or-create-new-session
rubo77
fonte
relacionado: stackoverflow.com/questions/3432536/…
Ciro Santilli escreveu

Respostas:

52

A resposta é muito mais simples. Basta colocar isso no seu ~/.tmux.confarquivo:

# if run as "tmux attach", create a session if one does not already exist
new-session -n $HOST

Se você executar tmux attache houver uma sessão, ela será anexada a essa sessão (se já estiver anexada ou não). Se ainda não houver uma sessão, ela criará uma para você.

Joe Casadonte
fonte
11
este é um truque interessante, mas há uma ressalva: se tmuxfor invocado sem argumentos, ele criará uma nova sessão e criará uma segunda sessão assim que atingir essa linha no seu ~/.tmux.conf. Você pode ver esse problema executando tmux lsapós criar a primeira sessão. Na prática, depois de colocar isso em seu arquivo, você não pode chamar tmuxsem argumentos mais
de Bruno Polaco
4
Então você teria que adicionar um alias alias tmux="tmux attach"para evitar este problema
rubo77
@BrunoPolaco: qual é a grande ressalva com uma sessão tmux extra vazia sendo executada o tempo todo (além disso, não parece arrumado na lista de tarefas)?
rubo77
@ rubo77 Recursos. Algumas pessoas têm algumas ferramentas padrão, janelas, painéis etc. criadas quando são iniciadas tmux.
rovr138
129

Se nomear sua sessão estiver correto, é fácil usar o new-sessioncomando:

tmux new-session -A -s main

onde mainé o nome da sessão que será anexado ou criado, se necessário.

De man tmux:

O -Asinalizador se new-sessioncomporta como attach-sessionse o nome da sessão já existisse; neste caso, -Dse comporta como -da attach-session.

Observe também que a -Aopção foi introduzida na versão tmux a 1.8partir de 26 de março de 2013 , para versões anteriores, use tmux attach || tmux.

Wesley Baugh
fonte
10
+1 para usar a funcionalidade built-in e fornecendo trecho homem doc
Ari Patrick
11
Na minha lista de alias: alias "tmux-attach-or-create-main-session=tmux new-session -A -s main". Obrigado pela dica! Página do manual: openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Jeroen Wiert Pluimers
tmux: unknown option -- AIsso parece estar disponível apenas nas versões recentes.
xApple 26/03
Este é o método que eu usei, mas você não pode mais usar "tmux desanexar". Você precisa usar o atalho <ctrl> b - d para salvar e sair de uma sessão existente.
Jess
2
[ -z "$TMUX" ] && exec tmux new -As .é isso que eu uso no meu .bashrc.
ryenus
30

Isso iniciará uma nova sessão se o anexo der um erro:

tmux attach || tmux new

Portanto, um alias fará o trabalho:

tm="tmux attach || tmux new"
rubo77
fonte
Você pode até torná-lo mais curto, mudando tmux attachparatmux a
Bruno Polaco 24/11
Embora esta seja funcional, solução de Wesley Baugh usa tmux built-in funcionalidade para fazer a mesma coisa
Ari Patrick
fwiw, essa parece ser a melhor resposta para versões mais antigas, antes da introdução de -A (por exemplo, v1.6)
Christopher Peterson
3

Considere adicionar o seguinte ao seu .bashrc

if [ -z "$TMUX" ]; then
    base_session='my_session'
    # Create a new session if it doesn't exist
    tmux has-session -t $base_session || tmux new-session -d -s $base_session
    # Are there any clients connected already?
    client_cnt=$(tmux list-clients | wc -l)
    if [ $client_cnt -ge 1 ]; then
        session_name=$base_session"-"$client_cnt
        tmux new-session -d -t $base_session -s $session_name
        tmux -2 attach-session -t $session_name \; set-option destroy-unattached
    else
        tmux -2 attach-session -t $base_session
    fi
fi

Você pode ver meu uso disso no meu arquivo de recursos ZSH no meu repositório do github

sparticvs
fonte
2

Para expandir a resposta de Wesley Baugh (que foi sessões de aninhamento duplo para mim quando usado no .bashrc em logins) e adicionar um pouco de flexibilidade, já que eu frequentemente uso sudo -sem servidores (que carregariam meu .bashrc de forma obediente novamente e aninham-se), aqui está o que tenho no meu .bashrc:

if [ -z "$TMUX" ] && [ ${UID} != 0 ]
then
    tmux new-session -A -s main
fi

Isso verifica uma sessão do tmux e garante que você não seja superusuário antes de criar uma nova sessão ou anexá-la àquela existente nomeada main.

Celsius1414
fonte
1

Drew Frank respondeu isso aqui: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Aqui está o script que agora uso para isso (porém, retornei à tela devido a outro problema no tmux) /somewhere/on/your/path/ttmuxou como uma função de shell:

#!/bin/sh
# many thanks to Drew Frank: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r
(tmux ls | grep -vq attached && tmux -2 at) || tmux -2

As -2opções fazem com que o tmux assuma o suporte ao terminal de 256 cores, portanto, esses podem não ser apropriados para sua situação.

SuperMagic
fonte
1

Melhorei um pouco a resposta do @SuperMagic. Coloquei esse bloco no topo da minha.zshrc

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi
cmcginty
fonte