Crie uma nova sessão tmux de dentro de uma sessão tmux

105

Estou escrevendo um script de shell que cria / anexa ou alterna para uma determinada sessão, dependendo se alguém está dentro do tmux e se a sessão existe.

Eu tenho tudo funcionando perfeitamente, exceto para o caso de exigir a criação de uma nova sessão tmux de dentro de uma sessão tmux.

Quando meu script é executado tmux new-session -s name, obtenho a seguinte saída:

as sessões devem ser aninhadas com cuidado, desative $ TMUX para forçar

Na verdade, não quero aninhar sessões, meu objetivo é criar outra sessão separada e alternar para ela de dentro de uma sessão tmux .

Isso é possível?

Michael Robinson
fonte
2
Um ÓTIMO recurso para os usuários que encontrarem esta pergunta: leanpub.com/the-tao-of-tmux/read
0xSheepdog

Respostas:

142

A maneira mais rápida (supondo que você use ctrl-bcomo prefixo de comando) é:

ctrl-b :new

Para criar uma nova sessão, então

ctrl-b s

para selecionar e anexar interativamente à sessão.

msharp
fonte
5
+1 para a solução que não se preocupa com "as sessões devem ser aninhadas com cuidado, desative $ TMUX para forçar"
Marcin Rogacki
3
e então você pode renomear sua sessão:ctrl-b $
nha
21
E Ctrl-b :new -s <name>para dar um nome à nova sessão.
Ain Tohvri
32

Como criar o script

Este script verificará se existe uma sessão. Se a sessão não existir, crie uma nova sessão e anexe a ela. Se a sessão não existe nada acontece e nós anexamos a essa sessão. Sinta-se à vontade para substituir `~ / development 'pelo nome do projeto.

$ touch ~/development && chmod +x ~/development

# ~/development

tmux has-session -t development
if [ $? != 0 ]
then
  tmux new-session -s development
fi
tmux attach -t development  

Nova sessão do terminal

Vamos criar duas sessões separadas, listá-las, anexar a uma e então, de dentro do tmux, percorrer as sessões.

tmux new -s name -dfunciona de dentro do tmux porque estamos criando uma nova sessão separada. Caso contrário, você obterá um erro de aninhamento.

$ tmux new -s development -d
$ tmux new -s foo -d
$ tmux ls
> development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]
> foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]
$ tmux attach -t
$ tmux ls
> development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54] (attached)
> foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]

Nova sessão de dentro do tmux

Agora estamos dentro ou mais conhecidos como anexados à nossa sessão de destino. Se tentarmos criar uma nova sessão enquanto anexada, isso resultará em um erro de aninhamento.

$ tmux new -s bar
> sessions should be nested with care, unset $TMUX to force

Para resolver isso, criamos uma nova sessão separada. por exemplo,

$ tmux new -s bar -d
$ tmux ls
> development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54] (attached)
> foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]
> bar: 1 windows (created Wed Jan 13 17:19:35 2016) [204x54]

Ciclo (troca) de sessões

  • Prefix ( sessão anterior
  • Prefix ) próxima sessão

nota: Prefix é Ctrl-bpor padrão. Você pode ligar Prefixpara Ctrl-ae no Mac OSX você pode mudar a tecla Caps Lock para ctrlsystem preferences > keyboard > modifier keys

Anexe a uma sessão usando o modo de comando enquanto estiver dentro do tmux

Tentar conectar a uma sessão sem desconectar resultará em erro.

$ tmux attach -t development
> sessions should be nested with care, unset $TMUX to force

Em vez disso, use o modo de comando Prefix :, digite attach -t session_namee pressione Enter.

Yonk
fonte
Obrigado pela resposta muito completa, isso respondeu algumas das minhas perguntas de uma vez!
mdekkers
24

Usar isso funciona para mim:

TMUX= tmux new-session -d -s name
tmux switch-client -t name

O TMUX=na primeira linha é necessário para que o tmux não gere uma sessions should be nested with care, unset $TMUX to forcemensagem.


fonte
1
Funciona muito bem no meu script depois de mudar a primeira linha para:TMUX=`tmux new-session -d -s name`
Michael Robinson
17

Todos os comandos que você pode lançar em seu terminal, como tmux new -s sessionNamepodem ser iniciados de dentro tmux, pressionando a tecla de gatilho (por exemplo ctrl-b:) e :depois o comando sem a tmuxparte inicial .

Como resultado, ctrl-b :seguido de new -s sessionNamefará exatamente o que você deseja e dará um nome à sua sessão. Ele também muda automaticamente para a nova sessão.

Morlock
fonte
10

Você pode tentar unset TMUXprimeiro, isso funciona para mim.

Xiao Hanyu
fonte
7

seguindo o conselho do usuário2354696, eu uso as seguintes combinações de teclas para criar uma nova sessão ou "clonar" uma sessão existente

chave de ligação N run-shell 'TMUX = tmux new-session -d \; switch-client -n '
bind-key C run-shell 'TMUX = tmux new-session -t $ (tmux display-message -p #S) -s $ (tmux display-message -p # S-clone) -d \; switch-client -n \; mensagem de exibição "sessão #S clonada" '
user1384039
fonte