Cómo crear una nueva sesión tmux si no existe

144

Estoy tratando de descubrir cómo adjuntarme a una tmux sessionsesión si existe una tmux con nombre, si no, quiero crear una nueva con el nombre dado.

Actualmente, conozco algunos tmuxcomandos que pueden lograr en parte lo que estoy buscando, pero no está claro cómo combinarlos para obtener lo que estoy buscando:

  • tmux attach se adjunta a una sesión existente automáticamente, pero se elimina el error si no existe
  • tmux new crea una nueva sesión, pero siempre lo hace, así que no puedo dejarla en mi .tmux.conf
  • tmux has-session prueba si existe una sesión, pero no sé cómo unirla con los otros comandos

Por lo tanto, me gustaría crear un script tmux, para que esto suceda automáticamente, en lugar de tener que crearlo manualmente cada vez que necesite iniciar sesión en una sesión.

¿Cómo puedo escribir un script automático para crear una nueva sesión de tmux (si no existe un nombre de sesión dado) o adjuntarlo a un nombre de sesión (si existe)?

rampion
fuente
15
@kzh: lo veo como una pregunta de herramienta de programación, como vim
rampion
66
He escrito otra posible respuesta a esta pregunta como una idea general, en caso de que alguien esté interesado: gist.github.com/chakrit/5004006
chakrit
9
Mientras tanto, mi man tmuxdice: "La bandera -A hace que la nueva sesión se comporte como adjuntar sesión si el nombre de la sesión ya existe"
Petr Viktorin
1
Para aquellos que marcan para mover esto, debo tener en cuenta que incluso los moderadores no pueden migrar preguntas de más de 60 días a otro sitio. Las razones de este límite del sistema se explican aquí .
Brad Larson
1
@BradLarson, actualmente, la mejor / más simple opción para hacer esto se responde en un comentario, muy abajo: stackoverflow.com/questions/3432536/… . La mayoría de los usuarios que vienen aquí no podrán encontrar esto. Obviamente, esta es una pregunta muy importante, como puede ver por el número de votos. ¿Es posible abrir esta pregunta, así que puedo agregarla como respuesta, para que otras personas puedan encontrarla?
alpha_989

Respuestas:

89

Alternativamente, puedes agregar

new-session

a su .tmux.conf- eso creará una sesión predeterminada en el inicio del servidor.

Luego tmux attachse adjuntará a la sesión actual (es decir, el servidor en ejecución) o creará una nueva sesión (iniciará el servidor, leerá el archivo de configuración, emitirá el new-sessioncomando) y se adjuntará a eso.

Leonid Shevtsov
fuente
3
Cuando esto crea una nueva sesión, la ruta predeterminada es mi directorio de inicio, no la ruta desde la que se invocó tmux.
Richard Hansen
2
@AB: ¿a qué respuesta te refieres?
Jürgen A. Erhard
¿Hay alguna manera de hacer que esto resuelva el problema de @ RichardHansen? Invocar desde el camino actual parece tener más sentido, y si lo new-sessiondestruye, entonces parece ser un problema real.
Lee Olayvar
2
Esto rompe la recarga de la configuración de tmux en caso de que la uses ( source-file ~/.tmux.conf)
Sebastian Blask
11
@SebastianBlask puede usar la -Aopción new-sessionsi nombra su sesión. new-session -A -s mysessionjugará bien con la recarga de configuración.
jkoelker
163

Lo descubrí ( y me lo señaló ).

tmux attach || tmux new
rampion
fuente
28
Esta respuesta funciona mejor para mí porque puedo nombrar la sesión: tmux attach-session -t my-session || tmux new-session -s my-session. El único problema es que esto no es atómico. tmux realmente debería tener un comando de crear o adjuntar.
Andrew
55
Tengo el siguiente alias en bash -alias tm='tmux attach || tmux new'
azat
10
Upvoting porque con un pequeño pellizco Esto funciona con sesiones con nombre: tmux attach -t some_name || tmux new -s some_name. Cambie some_name a $ 1, agregue un shebang y guarde.
Cheezmeister el
10
Nota para aquellos que no están familiarizados con tmux y se preguntan acerca de newvs new-session: son sinónimos, y también lo son attachy attach-session.
Esteis
1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultfunciona mucho mejor y no abre un segundo tmux en caso de que sea /bin/killel primero. El único inconveniente es que debe nombrar las sesiones para esto.
Tino
64

Como se señaló en los comentarios de Petr Viktorin , jkoelker y pjincz , puede usar el siguiente comando para adjuntarlo mySessionsi existe y para crearlo si no existe:

 tmux new -A -s mySession

De man tmux:

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

(alias: new)

Crea una nueva sesión con nombre session-name.

[...]

La -Abandera hace que se new-sessioncomporte como attach-sessionsi session-nameya existiera; en este caso, -Dse comporta como -da attach-session.

new-sessionha soportado -Adesde tmux-1.8 .

alpha_989
fuente
1
Si va a usar esto en algo gnome-terminalcomo el comando, le sugiero que omita el -snombre de sesión y el nombre de sesión específico para que no termine con CADA gnome-terminalsesión nueva adjunta a la misma sesión. Siempre puede seleccionar una sesión existente prefix + sdespués de abrir una nueva terminal.
dragon788
14

Aunque considero que la respuesta de rampion es suficiente para usar 1 sesión, este script le permite configurar varias sesiones:

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
fuente
13

Adaptando la sugerencia de Alex de incluir una configuración basada en proyectos al inicio, comencé a usar lo siguiente:

# ~/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

¿Dónde tmux-myproject.confestá mi serie de comandos tmux de inicio para crear mis ventanas y paneles, así como para iniciar mis editores?

Anm
fuente
8

Utilizo un alias para crear una nueva sesión si es necesario, y adjunto a mi sesión predeterminada si ya existe:

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

Agregué esto a mi .login en mi servidor.

La razón por la que lo hago de esta manera es porque no quiero adjuntarme a la misma sesión real, quiero una nueva sesión que use el mismo grupo de ventanas.

Esto también es similar a correr screen -xRR.

Miguel
fuente
2
Si entra y sale de su sesión a menudo, esto deja muchas sesiones sin usar, como se ve por tmux list-sessions.
Anm
Sí, lo hace, solo los limpio de vez en cuando. Es un inconveniente menor obtener la funcionalidad que quiero.
Michael
Hola, @ mateusz-piotrowski: estoy de acuerdo con la edición para envolver mi código en un bloque de código, pero ¿por qué editarías el otro texto para que sea diferente de lo que dije? Lamento comentar aquí, pero no vi en ningún otro lado.
Michael
No quise ofenderte. Solo pensé que no podías ejecutar un alias en un archivo de configuración, por lo que debe haber sido un error tipográfico.
Mateusz Piotrowski el
3
Por ahora, solo puede escribir: tmux new -A -s defaultpara iniciar una nueva sesión si no existe o adjuntarla automáticamente. Creo que es mucho mejor que editar el archivo de configuración.
pjincz
1

Para aquellos que quieren hacer lo mismo en fish:

tmux attach -t mysesh; or tmux new -s mysesh
pequeña chispa
fuente