Como criar uma nova sessão tmux, se nenhuma existir

144

Estou tentando descobrir como anexar a uma, tmux sessionse existir uma sessão tmux nomeada; caso contrário, quero criar uma nova com o nome fornecido.

Atualmente, conheço alguns tmuxcomandos que podem parcialmente alcançar o que estou procurando, mas não está claro como combiná-los para obter o que estou procurando:

  • tmux attach anexa a uma sessão existente automaticamente - mas com erros se não existir nenhuma sessão
  • tmux new cria uma nova sessão - mas sempre o faz, por isso não posso deixá-la no meu .tmux.conf
  • tmux has-session testa se existe uma sessão - mas não sei como costurá-la com os outros comandos

Assim, eu gostaria de criar um script tmux, para que isso aconteça automaticamente, em vez de ter que criá-lo manualmente toda vez que precisar fazer logon em uma sessão.

Como posso escrever um script automático para criar uma nova sessão tmux (se um nome de sessão não existir) ou anexar a um nome de sessão (se existir)?

rampion
fonte
15
@kzh: Eu vê-lo como uma questão ferramenta de programação, como vim
rampion
6
Eu escrevi outra resposta possível para esta pergunta como uma essência, caso alguém esteja interessado: gist.github.com/chakrit/5004006
chakrit
9
Enquanto isso, meu man tmuxdiz: "A bandeira -A faz nova sessão se comportam como anexar-sessão se sessão-name já existe"
Petr Viktorin
1
Para aqueles que sinalizam para mudar isso, devo observar que mesmo moderadores não podem migrar perguntas com mais de 60 dias para outro site. As razões para esse limite do sistema são explicadas aqui .
Brad Larson
1
@BradLarson, atualmente, a melhor / mais simples opção para fazer isso é respondida em um comentário, abaixo: stackoverflow.com/questions/3432536/… . A maioria dos usuários que vem aqui não poderá encontrar isso. Esta é obviamente uma pergunta muito importante, como você pode ver pelo número de votos. É possível abrir esta pergunta, para que eu possa adicioná-la como resposta, para que novas pessoas possam encontrar isso?
alpha_989

Respostas:

89

Como alternativa, você pode adicionar

new-session

ao seu .tmux.conf- que criará uma sessão padrão na inicialização do servidor.

Em seguida, ele tmux attachserá anexado à sessão atual (servidor em execução, ou seja) ou criará uma nova sessão (iniciar o servidor, ler o arquivo de configuração, emitir o new-sessioncomando) e anexar a ela.

Leonid Shevtsov
fonte
3
Quando isso cria uma nova sessão, o caminho padrão é o meu diretório pessoal, não o caminho a partir do qual o tmux foi chamado.
Richard Hansen
2
@AB: qual resposta você quer dizer?
Jürgen A. Erhard
Existe uma maneira de resolver esse problema do @ RichardHansen? Invocar do caminho atual parece fazer mais sentido e, se o new-sessiondestruir, parece ser um problema real.
Lee Olayvar
2
Isso quebra o tmux configuração recarga no caso de você usá-lo ( source-file ~/.tmux.conf)
Sebastian Blask
11
@SebastianBlask, você pode usar a -Aopção new-sessionse nomear sua sessão. new-session -A -s mysessionjogará bem com o recarregamento da configuração.
jkoelker
163

Eu percebi isso ( e ele apontou para mim ).

tmux attach || tmux new
rampion
fonte
28
Esta resposta funciona melhor para mim, porque eu posso citar a sessão: tmux attach-session -t my-session || tmux new-session -s my-session. O único problema é que isso não é atômico. O tmux realmente deve ter um comando de criação ou conexão.
11303 Andrew
5
Tenho próxima apelido em bash -alias tm='tmux attach || tmux new'
Azat
10
Upvoting porque com um pequeno puxão isso funciona com sessões nomeadas: tmux attach -t some_name || tmux new -s some_name. Mude some_name para $ 1 adicione um shebang e salve.
Cheezmeister
10
Nota para aqueles não familiarizados com tmux e se perguntando sobre newvs new-session: eles são sinônimos, e por isso são attache attach-session.
Esteis
1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultfunciona muito melhor e não abre um segundo tmux no caso de você ser /bin/killo primeiro. A única desvantagem é que você precisa nomear as sessões para isso.
Tino
64

Como apontado nos comentários de Petr Viktorin , jkoelker e pjincz , você pode usar o seguinte comando para anexar mySessionse ele existir, e criá-lo se não existir:

 tmux new -A -s mySession

De man tmux:

new-session[-AdDEP] [-cstart-directory] [-Fformat] [-nwindow-name] [-ssession-name] [-tgroup-name] [-xwidth] [-yheight] [shell-command]

(pseudónimo: new)

Crie uma nova sessão com o nome session-name.

[...]

A -Abandeira faz new-sessionse comportar como attach-sessionse session-namejá existisse; neste caso, -Dse comporta como -da attach-session.

new-sessionsuporta -Adesde tmux-1.8 .

alpha_989
fonte
1
Se você for usar isso em algo como gnome-terminalo comando, sugiro que deixe de lado o -snome da sessão e o nome específico da sessão para que você não acabe com TODAS as novas gnome-terminalsessões anexadas à mesma sessão. Você sempre pode selecionar uma sessão existente prefix + sapós abrir um novo terminal.
precisa saber é o seguinte
14

Embora eu ache que a resposta de rampion é suficiente para usar 1 sessão, este script permite configurar várias sessões:

SESSIONS="work play"

function has-session {
    tmux has-session -t $1 2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        $1
    fi
}

# Configure your sessions here
function session-work
{
    tmux new-session -d -s work
    tmux neww -k -t work:1
}

function session-play
{
    tmux new-session -d -s play
    tmux neww -k -t play:1
}

#
#MAIN 
for x in $SESSIONS
do
    echo $x
    has-session $x
    except session-$x
done

NOTA:

-k  --> new-window will not be created if already exists
-d  --> start session or window, but don't attach to it yet
-s  --> name the session
-t  --> specify a target location in the form session:window.pane 
Alex Gaudio
fonte
13

Adaptando a sugestão de Alex para incluir a configuração baseada em projeto na inicialização, comecei a usar o seguinte:

# ~/bin/tmux-myproject shell script
# The Project name is also used as a session name (usually shorter)
PROJECT_NAME="myproject"
PROJECT_DIR="~/myproject"

tmux has-session -t $PROJECT_NAME 2>/dev/null
if [ "$?" -eq 1 ] ; then
    echo "No Session found.  Creating and configuring."
    pushd $PROJECT_DIR
    tmux new-session -d -s $PROJECT_NAME
    tmux source-file ~/bin/tmux-${PROJECT_NAME}.conf
    popd
else
    echo "Session found.  Connecting."
fi
tmux attach-session -t $PROJECT_NAME

onde tmux-myproject.confestá minha série de inicialização dos comandos tmux para criar minhas janelas e painéis e iniciar meus editores.

Anm
fonte
8

Eu uso um alias para criar uma nova sessão, se necessário, e anexo à minha sessão padrão, se ela já existir:

alias tmuxre='tmux new-session -t default || tmux new-session -s default'

Adicionei isso ao meu .login no meu servidor.

O motivo de fazê-lo dessa maneira é porque não quero anexar à mesma sessão real, quero uma nova sessão que use o mesmo grupo de janelas.

Isso também é semelhante à execução screen -xRR.

Michael
fonte
2
Se você entra e sai de sua sessão com frequência, isso deixa muitas sessões não utilizadas, como visto por tmux list-sessions.
Anm 16/08/12
Sim, sim, eu apenas os limpo de vez em quando. É uma pequena desvantagem obter a funcionalidade que desejo.
Michael
Hey @ mateusz-piotrowski - Concordo com a edição para agrupar meu código em um bloco de código, mas por que você editaria o outro texto para ser diferente do que eu disse? Desculpe comentar aqui, mas não vi em nenhum outro lugar.
Michael
Eu não quis te ofender. Eu apenas pensei que você não poderia executar um alias em um arquivo de configuração e, portanto, deve ter sido um erro de digitação.
Mateusz Piotrowski
3
Até agora, você pode apenas digitar: tmux new -A -s defaultpara iniciar uma nova sessão, se ela não existir, ou anexar automaticamente. Eu acho que é muito melhor do que editar o arquivo de configuração.
Pjincz
1

Para quem quer fazer o mesmo em fish:

tmux attach -t mysesh; or tmux new -s mysesh
tinyspark
fonte