tmux equivalente a "screen -R"?


10

O tmux attachcomando age mais como uma combinação de screen -re screen -x- primeiro tenta se conectar à sessão desanexada mais recente e, se não houver nenhum disponível, ele será anexado a uma sessão atualmente anexada. Quero emular o comportamento de screen -R: primeiro tente conectar-se a uma sessão desanexada e, em seguida, inicie uma nova sessão se não houver sessões desanexadas. Qual é a melhor maneira de conseguir isso no tmux?

Respostas:


12

Após consultar os assistentes do IRC, estou confiante de que não há um comando tmux único que tenha esse comportamento. Felizmente, é bastante fácil emular usando o shell:

(tmux ls | grep -vq attached && tmux at) || tmux

(tmux ls 2>/dev/null | grep -vq attached && tmux at) || tmux
Edição secundária

3

Apesar do que diz no manual do tmux:

             The target-session rules for attach-session are slightly
         adjusted: if tmux needs to select the most recently used session,
         it will prefer the most recently used unattached session.

A resposta de Drew não funcionará corretamente em uma situação como:

0: 1 windows (created Wed Nov  7 23:51:08 2012) [177x47]
1: 1 windows (created Wed Nov  7 23:51:33 2012) [177x47] (attached)

tmux atserá anexado à última sessão (nº 1) (mesmo que essa sessão ainda esteja anexada em outro lugar). Isso arruina toda a idéia de executar várias sessões do tmux e se conectar apenas a uma sessão desanexada (para usar o mosh + tmux + iterm2 para criar um terminal de roaming perfeito).

Outra abordagem seria selecionar manualmente uma sessão não anexada:

tmux ls | grep -vq attached && tmux at `tmux ls | grep -vm1 attached | cut -d: -f1`


Boa pegada! A documentação está fora de sincronia com o comportamento real. Eu criei um relatório de bug para isso.
Drew Frank

Foi lançado um patch que corrige isso; portanto, no próximo lançamento, ele deverá se comportar conforme anunciado.
Tirou Frank

O patch está no 1.8?
momeara

2

Eu costumo ter apenas duas sessões do tmux por vez, então faço algo assim em cada janela do terminal.

janela do terminal 0:

tmux attach -t 0 || tmux new

janela do terminal 1:

tmux attach -t 1 || tmux new

2

Isso funcionou melhor para mim:

if [ -z "$TMUX" ]; then
     (tmux ls | grep -vq attached && tmux at -t `tmux ls | grep -vm1 attached | cut -d: -f1`) || tmux new
fi

O -t é necessário para se conectar à sessão apropriada.


1

A respeito

tmux attach || tmux new

ou apenas crie o arquivo ~/.tmux.confse ele não existir e adicione

new-session

para que crie uma nova sessão quando não houver nenhuma quando você executar tmux attach.

Também pode ser útil criar tmuxum alias para tmux attach.


A primeira proposta seria anexada às sessões tmux atualmente anexadas (semelhante à tela -x), que é algo que eu quero evitar. A segunda proposta exibe esse mesmo problema e também tem a conseqüência indesejável de criar sessões tmux "extras" quando eu uso o comando tmux source-file para recarregar a configuração.
Tirou Frank
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.