Comment créer une nouvelle session tmux s'il n'en existe pas

144

J'essaie de comprendre comment attacher à une tmux sessionsession tmux nommée, sinon je veux en créer une nouvelle avec le nom donné.

Actuellement, je connais quelques tmuxcommandes qui peuvent en partie atteindre ce que je recherche, mais il n'est pas clair comment les combiner pour obtenir ce que je recherche:

  • tmux attach s'attache à une session existante automatiquement - mais les erreurs se produisent si aucune session n'existe
  • tmux new crée une nouvelle session - mais elle le fait à chaque fois, je ne peux donc pas la laisser dans mon .tmux.conf
  • tmux has-session teste si une session existe - mais je ne sais pas comment l'assembler avec les autres commandes

Ainsi, je voudrais créer un script tmux, de sorte que cela se produise automatiquement, au lieu d'avoir à le créer manuellement à chaque fois que j'ai besoin de me connecter à une session.

Comment puis-je écrire un script automatique pour créer une nouvelle session tmux (si un nom de session donné n'existe pas) ou l'attacher à un nom de session (s'il existe)?

rampion
la source
15
@kzh: Je le considère comme une question d'outil de programmation, comme vim
rampion
6
J'ai écrit une autre réponse possible à cette question, au cas où quelqu'un serait
chakrit
9
Pendant ce temps, mon man tmuxdit: "Le drapeau -A fait que la nouvelle session se comporte comme attach-session si le nom de session existe déjà"
Petr Viktorin
1
Pour ceux qui signalent de déplacer cela, je dois noter que même les modérateurs ne peuvent pas migrer des questions de plus de 60 jours vers un autre site. Les raisons de cette limite du système sont expliquées ici .
Brad Larson
1
@BradLarson, actuellement, la meilleure / la plus simple option pour faire cela est répondu dans un commentaire, en bas: stackoverflow.com/questions/3432536/… . La plupart des utilisateurs qui viennent ici ne pourront pas trouver cela. C'est évidemment une question très importante comme vous pouvez le voir par le nombre de votes. Est-il possible d'ouvrir cette question pour que je puisse l'ajouter comme réponse, afin que de nouvelles personnes puissent la trouver?
alpha_989

Réponses:

89

Vous pouvez également ajouter

new-session

à ton .tmux.conf - cela créera une session par défaut au démarrage du serveur.

Ensuite tmux attach, soit s'attacher à la session en cours (serveur en cours d'exécution, c'est-à-dire), soit créer une nouvelle session (démarrer le serveur, lire le fichier de configuration, émettre la new-sessioncommande) et s'y attacher.

Léonid Chevtsov
la source
3
Lorsque cela crée une nouvelle session, le chemin par défaut est mon répertoire personnel, pas le chemin à partir duquel tmux a été appelé.
Richard Hansen le
2
@AB: de quelle réponse parlez-vous?
Jürgen A. Erhard
Y a-t-il un moyen de résoudre le problème de @ RichardHansen? Invoquer à partir du chemin actuel semble avoir le plus de sens, et si cela new-sessiondétruit cela, cela semble être un réel problème.
Lee Olayvar
2
Cela interrompt le rechargement de la configuration tmux au cas où vous l'utiliseriez ( source-file ~/.tmux.conf)
Sebastian Blask
11
@SebastianBlask vous pouvez utiliser l' -Aoption new-sessionsi vous nommez votre session. new-session -A -s mysessionjouera bien avec le rechargement de la configuration.
jkoelker
163

Je l'ai compris ( et je l'ai fait remarquer ).

tmux attach || tmux new
rampion
la source
28
Cette réponse fonctionne mieux pour moi parce que je peux nommer la session: tmux attach-session -t my-session || tmux new-session -s my-session. Le seul problème est que ce n'est pas atomique. tmux devrait vraiment avoir une commande create-or-attach.
Andrew
5
J'ai le prochain alias dans bash -alias tm='tmux attach || tmux new'
azat
10
Upvoting car avec un petit tweak cela fonctionne avec des sessions nommées: tmux attach -t some_name || tmux new -s some_name. Remplacez some_name par $ 1, ajoutez un shebang et enregistrez.
Cheezmeister
10
Remarque à l'attention de ceux qui ne connaissent pas tmux et qui s'interrogent sur newvs new-session: ce sont des synonymes, tout comme attachet attach-session.
Esteis
1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultfonctionne beaucoup mieux et n'ouvre pas un deuxième tmux au cas où vous auriez /bin/killle premier. Le seul inconvénient est que vous devez nommer les sessions pour cela.
Tino
64

Comme indiqué dans les commentaires de Petr Viktorin , jkoelker et pjincz , vous pouvez utiliser la commande suivante pour vous attacher à mySessions'il existe et pour le créer si ce n'est pas le cas:

 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)

Créez une nouvelle session avec un nom session-name.

[...]

Le -Adrapeau fait new-sessionse comporter comme attach-sessions'il session-nameexiste déjà; dans ce cas, -Dse comporte comme -dà attach-session.

new-sessionprend en charge -Adepuis tmux-1.8 .

alpha_989
la source
1
Si vous prévoyez d'utiliser ceci dans quelque chose comme gnome-terminalla commande, je vous suggère de laisser le -set le nom de session spécifique afin de ne pas vous retrouver avec CHAQUE nouvelle gnome-terminalsession attachée à la même session. Vous pouvez toujours sélectionner une session existante avec prefix + saprès l'ouverture d'un nouveau terminal.
dragon788
14

Bien que je trouve que la réponse de rampion est suffisante pour utiliser 1 session, ce script vous permet de configurer plusieurs sessions:

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

REMARQUE:

-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
la source
13

En adaptant la suggestion d'Alex pour inclure la configuration basée sur le projet au démarrage, j'ai commencé à utiliser ce qui suit:

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

tmux-myproject.confest ma série de démarrage de commandes tmux pour créer mes fenêtres et mes volets, ainsi que démarrer mes éditeurs.

Anm
la source
8

J'utilise un alias pour créer une nouvelle session si nécessaire, et je m'attache à ma session par défaut si elle existe déjà:

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

J'ai ajouté ceci à mon .login sur mon serveur.

La raison pour laquelle je le fais de cette façon est que je ne veux pas m'attacher à la même session réelle, je veux une nouvelle session qui utilise le même groupe de fenêtres.

Ceci est également similaire à la course screen -xRR.

Michael
la source
2
Si vous êtes souvent dans et hors de votre session, cela laisse beaucoup de sessions inutilisées, comme le voit tmux list-sessions.
Anm
Ouais, c'est vrai, je les nettoie de temps en temps. C'est un inconvénient mineur pour obtenir la fonctionnalité que je souhaite.
Michael
Hey @ mateusz-piotrowski - Je suis d'accord avec la modification pour envelopper mon code dans un bloc de code, mais pourquoi éditeriez-vous l'autre texte pour qu'il soit différent de ce que j'ai dit? Désolé de commenter ici mais je n'ai vu nulle part ailleurs.
Michael
Je ne voulais pas vous offenser. Je pensais juste que vous ne pouviez pas exécuter un alias dans un fichier de configuration et que cela devait donc être une faute de frappe.
Mateusz Piotrowski
3
À présent, vous pouvez simplement taper: tmux new -A -s defaultpour lancer une nouvelle session si elle n'existe pas ou attacher automatiquement. Je pense que c'est bien mieux que d'éditer un fichier de configuration.
pjincz
1

Pour ceux qui veulent faire la même chose en fish:

tmux attach -t mysesh; or tmux new -s mysesh
tinyspark
la source