Cree una nueva sesión tmux desde dentro de una sesión tmux

105

Estoy escribiendo un script de shell que crea / adjunta o cambia a una sesión determinada, dependiendo de si hay uno dentro de tmux y la sesión existe.

Tengo todo funcionando muy bien, excepto por el caso que requiere la creación de una nueva sesión tmux desde dentro de una sesión tmux.

Cuando se ejecuta mi script tmux new-session -s name, obtengo el siguiente resultado:

las sesiones deben anidarse con cuidado, desarmar $ TMUX para forzar

En realidad, no quiero anidar sesiones, mi objetivo es crear otra sesión separada y cambiar a ella desde una sesión tmux .

es posible?

Michael Robinson
fuente
2
Un GRAN recurso para los usuarios que encuentran esta pregunta: leanpub.com/the-tao-of-tmux/read
0xSheepdog

Respuestas:

142

La forma más rápida (suponiendo que la use ctrl-bcomo prefijo de comando) es:

ctrl-b :new

Para crear una nueva sesión,

ctrl-b s

para seleccionar interactivamente y adjuntar a la sesión.

msharp
fuente
5
+1 para una solución que no se preocupa por "las sesiones deben anidarse con cuidado, desarmar $ TMUX para forzar"
Marcin Rogacki
3
y luego podría cambiar el nombre de su sesión:ctrl-b $
nha
21
Y Ctrl-b :new -s <name>darle un nombre a la nueva sesión.
Ain Tohvri
32

Cómo crear el guión

Este script comprobará si existe una sesión. Si la sesión no existe, cree una nueva sesión y adjúntela. Si la sesión existe no pasa nada y nos adjuntamos a esa sesión. Siéntase libre de reemplazar `~ / desarrollo 'con el nombre del proyecto.

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

# ~/development

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

Nueva sesión desde terminal

Vamos a crear dos sesiones separadas, enumerarlas, adjuntarlas a una y luego, desde dentro de tmux, recorrer las sesiones.

tmux new -s name -dfunciona desde dentro de tmux porque estamos creando una nueva sesión separada. De lo contrario, obtendrá un error de anidamiento.

$ 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]

Nueva sesión desde dentro de tmux

Ahora estamos dentro o más conocidos como adjuntos a nuestra sesión de destino. Si intentamos crear una nueva sesión mientras estamos adjuntos, se producirá un error de anidamiento.

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

Para solucionar esto creamos una nueva sesión separada. p.ej,

$ 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]

Sesiones de ciclo (cambio)

  • Prefix ( sesión anterior
  • Prefix ) próxima sesión

nota: Prefix es Ctrl-bpor defecto. Puede unirse Prefixa Ctrl-a, y en Mac OS X puede cambiar el bloqueo de mayúsculas a ctrlsystem preferences > keyboard > modifier keys

Adjuntar a una sesión usando el modo de comando mientras está dentro de tmux

Si intenta conectarse a una sesión sin desconectarse, se producirá un error.

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

En su lugar, use el modo de comando, Prefix :luego escriba attach -t session_namey presione enter.

Yonk
fuente
Gracias por la respuesta tan completa, ¡esto respondió algunas de mis preguntas de una vez!
mdekkers
24

Usar esto funciona para mí:

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

Se TMUX=requiere en la primera línea para que tmux no arroje un sessions should be nested with care, unset $TMUX to forcemensaje.


fuente
1
Funciona muy bien en mi guión después de cambiar la primera línea a:TMUX=`tmux new-session -d -s name`
Michael Robinson
17

Todos los comandos que puede ejecutar dentro de su terminal, como tmux new -s sessionNamese pueden ejecutar desde dentro tmuxpresionando la tecla de activación (por ejemplo:) ctrl-by :luego el comando sin la tmuxparte inicial .

Como resultado, ctrl-b :seguido de new -s sessionNamehará exactamente lo que desea y le dará un nombre a su sesión. También cambia automáticamente a la nueva sesión.

Morlock
fuente
10

Puedes probar unset TMUXprimero, esto funciona para mí.

Xiao Hanyu
fuente
7

según el consejo de user2354696, utilizo las siguientes combinaciones de teclas para crear una nueva sesión o "clonar" una sesión existente

bind-key N run-shell 'TMUX = tmux nueva-sesión -d \; cambiar-cliente -n '
bind-key C run-shell 'TMUX = tmux nueva-sesión -t $ (tmux display-message -p #S) -s $ (tmux display-message -p # S-clone) -d \; switch-client -n \; display-message "sesión #S clonada" '
usuario1384039
fuente