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

70

Se eu usar

tmux attach

Eu posso me conectar a uma sessão em execução, mas se não houver sessão sendo executada, 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
    
por rubo77 05.12.2013 / 20:04

8 respostas

40

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

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

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

    
por 06.12.2013 / 02:19
101

Se nomear sua sessão está bem, então é fácil fazer com o comando new-session :

tmux new-session -A -s main

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

De man tmux :

The -A flag makes new-session behave like attach-session if session-name already exists; in this case, -D behaves like -d to attach-session.

Observe também que a opção -A é apresentada em versão tmux 1.8 de 26 de março de 2013 , para versões anteriores, use tmux attach || tmux .

    
por 31.12.2014 / 23:43
24

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

tmux attach || tmux new

Então, um alias fará o trabalho:

tm="tmux attach || tmux new"
    
por 05.12.2013 / 23:11
2

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 do ZSH em meu repositório do github

    
por 05.12.2013 / 20:18
2

Se você estiver usando isso em um arquivo .shrc ou similar com exec , recomendo

if tmux ls
  exec tmux attach
else
  exec tmux
fi
    
por 05.02.2016 / 23:55
2

Eu melhorei a resposta do @SuperMagic um pouco. Eu coloquei este bloco no topo do meu .zshrc

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi
    
por 25.02.2016 / 01:47
1

Drew Frank respondeu isso aqui: link

Aqui está o script que eu uso agora para isso (embora, eu mudei de volta para a tela devido a outro problema com o tmux) /somewhere/on/your/path/ttmux ou como uma função 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 opções -2 fazem o tmux assumir o suporte ao terminal de 256 cores, então elas podem não ser apropriadas para sua situação.

    
por 05.12.2013 / 20:11
1

Para expandir a resposta de Wesley Baugh (que era sessões de aninhamento duplo para mim quando usado em .bashrc em logins) e adicionar um pouco de flexibilidade, pois geralmente uso sudo -s em servidores (o que carregaria obedientemente meu .bashrc novamente e double nest), aqui está o que eu 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 é o superusuário antes de criar uma nova sessão ou anexá-la àquela existente chamada main .

    
por 01.02.2018 / 19:01

Tags