Comment démarrer tmux avec attach si une session existe

92

Si j'utilise

tmux attach

Je peux m'attacher à une session en cours, mais s'il n'y a pas de session en cours, je ne reçois que l'erreur.

no sessions

Comment puis-je démarrer automatiquement une nouvelle session s'il n'y en a aucune? quelque chose comme

tmux attach-or-create-new-session
rubo77
la source
related: stackoverflow.com/questions/3432536/…
Ciro Santilli a rejoint le groupe

Réponses:

52

La réponse est beaucoup plus simple. Il suffit de mettre ceci dans votre ~/.tmux.confdossier:

# if run as "tmux attach", create a session if one does not already exist
new-session -n $HOST

Si vous exécutez tmux attachet qu'il y a une session, il sera attaché à cette session (qu'elle soit déjà attachée ou non). S'il n'y a pas déjà une session, elle en créera une pour vous.

Joe Casadonte
la source
11
C'est une astuce, mais il y a une mise en garde: si tmuxest appelé sans arguments, il va créer une nouvelle session, puis créer une deuxième session dès qu'il atteint cette ligne dans votre ~/.tmux.conf. Vous pouvez voir ce problème en exécutant tmux lsaprès la création de la première session. En pratique, après avoir mis cela dans votre dossier, vous ne pouvez plus appeler tmuxsans arguments
Bruno Polaco
4
Il faudra donc ajouter un alias alias tmux="tmux attach"pour éviter ce problème
rubo77
@BrunoPolaco: quelle est la plus grande mise en garde avec une session tmux très vide en permanence (mis à part le fait qu'elle n'a pas l'air bien rangée dans la liste des tâches)?
rubo77
@ rubo77 Ressources. Certaines personnes ont créé quelques outils, fenêtres, panneaux, etc. par défaut lors de leur lancement tmux.
rovr138
130

Si nommer votre session est correct, il est facile à faire avec la new-sessioncommande:

tmux new-session -A -s main

mainest le nom de la session qui sera attachée ou créée si nécessaire.

De man tmux:

Le -Adrapeau fait new-sessionse comporter comme attach-sessionsi le nom de session existait déjà; dans ce cas, -Dse comporte comme -dà attach-session.

Veuillez également noter que l' -Aoption est introduite dans la version 1.8de tmux à partir du 26 mars 2013 , pour les versions antérieures tmux attach || tmux.

Wesley Baugh
la source
10
+1 pour l'utilisation de la fonctionnalité intégrée et la fourniture d'un extrait de document man
Ari Patrick
1
Dans ma liste d'alias: alias "tmux-attach-or-create-main-session=tmux new-session -A -s main". Merci pour le conseil! Page du manuel: openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Jeroen Wiert Pluimers
tmux: unknown option -- ACela ne semble être disponible que dans les versions récentes.
xApple
C’est la méthode que j’ai utilisée, mais vous ne pouvez plus utiliser "tmux detach". Vous devez utiliser le raccourci <ctrl> b - d pour enregistrer et quitter une session existante.
Jess
2
[ -z "$TMUX" ] && exec tmux new -As .c'est ce que j'utilise dans mes .bashrc.
Ryenus
30

Cela va démarrer une nouvelle session si attach donne une erreur:

tmux attach || tmux new

Donc, un alias fera le travail:

tm="tmux attach || tmux new"
rubo77
la source
Vous pouvez même le rendre plus court en changeant tmux attachdetmux a
Bruno Polaco
Bien que cela soit fonctionnel, la solution de Wesley Baugh utilise la fonctionnalité intégrée de tmux pour faire la même chose
Ari Patrick
Cela semble être la meilleure solution pour les anciennes versions, avant l’introduction de -A (exemple: v1.6)
Christopher Peterson
3

Envisagez d’ajouter ce qui suit à votre .bashrc

if [ -z "$TMUX" ]; then
    base_session='my_session'
    # Create a new session if it doesn't exist
    tmux has-session -t $base_session || tmux new-session -d -s $base_session
    # Are there any clients connected already?
    client_cnt=$(tmux list-clients | wc -l)
    if [ $client_cnt -ge 1 ]; then
        session_name=$base_session"-"$client_cnt
        tmux new-session -d -t $base_session -s $session_name
        tmux -2 attach-session -t $session_name \; set-option destroy-unattached
    else
        tmux -2 attach-session -t $base_session
    fi
fi

Vous pouvez voir mon utilisation de ceci dans mon fichier de ressources ZSH sur mon dépôt github

sparticvs
la source
2

Pour développer la réponse de Wesley Baugh (qui était des sessions de double imbrication pour moi lorsqu’elle est utilisée dans .bashrc lors de la connexion) et pour ajouter un peu de flexibilité car j’utilise souvent sudo -ssur des serveurs (ce qui chargerait consciencieusement mon nouveau .bashrc et double imbriquée), voici ce que j'ai dans mon .bashrc:

if [ -z "$TMUX" ] && [ ${UID} != 0 ]
then
    tmux new-session -A -s main
fi

Ceci vérifie la présence d’une session tmux et vérifie que vous n’êtes pas superutilisateur avant de créer une nouvelle session ou d’attacher celle qui existe déjà main.

Celsius1414
la source
1

Drew Frank a répondu à ceci ici: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Voici le script que j'utilise maintenant pour cela (bien que je sois revenu à l'écran en raison d'un autre problème avec tmux) /somewhere/on/your/path/ttmuxou en tant que fonction shell:

#!/bin/sh
# many thanks to Drew Frank: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r
(tmux ls | grep -vq attached && tmux -2 at) || tmux -2

Les -2options permettent à tmux de prendre en charge les terminaux en 256 couleurs; il est donc possible que ceux-ci ne conviennent pas à votre situation.

SuperMagic
la source
1

J'ai amélioré @SuperMagic répondre un peu. Je mets ce bloc en haut de ma.zshrc

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi
cmcginty
la source