Créer une nouvelle session tmux à partir d'une session tmux

105

J'écris un script shell qui crée / attache ou bascule vers une session donnée, selon que l'on est à l'intérieur de tmux et que la session existe.

Tout fonctionne très bien, à l'exception du cas nécessitant la création d'une nouvelle session tmux à partir d'une session tmux.

Lorsque mon script s'exécute tmux new-session -s name, j'obtiens la sortie suivante:

les sessions doivent être imbriquées avec soin, désactivez $ TMUX pour forcer

Je ne veux pas vraiment imbriquer les sessions, mon objectif est de créer une autre session séparée et d'y basculer depuis une session tmux .

Est-ce possible?

Michael Robinson
la source
2
Une GRANDE ressource pour les utilisateurs qui trouvent cette question: leanpub.com/the-tao-of-tmux/read
0xSheepdog

Réponses:

143

Le moyen le plus rapide (en supposant que vous l'utilisez ctrl-bcomme préfixe de commande) est:

ctrl-b :new

Pour créer une nouvelle session, alors

ctrl-b s

pour sélectionner et joindre interactivement à la session.

msharp
la source
5
+1 pour une solution qui ne se soucie pas de "les sessions doivent être imbriquées avec précaution, désactivez $ TMUX pour forcer"
Marcin Rogacki
3
et vous pourrez alors renommer votre session:ctrl-b $
nha
21
Et Ctrl-b :new -s <name>pour donner un nom à la nouvelle session.
Ain Tohvri
32

Comment créer le script

Ce script vérifiera si une session existe. Si la session n'existe pas, créez une nouvelle session et attachez-la. Si la session existe, rien ne se passe et nous nous attachons à cette session. N'hésitez pas à remplacer `~ / development 'par le nom du projet.

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

# ~/development

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

Nouvelle session depuis le terminal

Créons deux sessions détachées, listons-les, attachons-nous à une, puis depuis tmux, parcourons les sessions.

tmux new -s name -dfonctionne depuis l'intérieur de tmux car nous créons une nouvelle session détachée. Sinon, vous obtiendrez une erreur d'imbrication.

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

Nouvelle session depuis tmux

Nous sommes maintenant à l'intérieur ou mieux connus comme attachés à notre session cible. Si nous essayons de créer une nouvelle session en étant attaché, cela entraînera une erreur d'imbrication.

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

Pour résoudre ce problème, nous créons une nouvelle session détachée. par exemple,

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

Cycle (commutateur) de sessions

  • Prefix ( session précédente
  • Prefix ) prochaine session

remarque: Prefix est Ctrl-bpar défaut. Vous pouvez vous lier Prefixà Ctrl-aet dans Mac OSX, vous pouvez changer le verrouillage des majuscules en ctrlsystem preferences > keyboard > modifier keys

Joindre à une session en utilisant le mode commande à l'intérieur de tmux

Toute tentative de connexion à une session sans se détacher entraînera une erreur.

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

Utilisez plutôt le mode commande Prefix :puis tapez attach -t session_nameet appuyez sur Entrée.

Yonk
la source
Merci pour la réponse très complète, cela a répondu à quelques-unes de mes questions à la fois!
mdekkers
24

L'utilisation de cela fonctionne pour moi:

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

Le TMUX=sur la première ligne est requis pour que tmux ne lance pas de sessions should be nested with care, unset $TMUX to forcemessage.


la source
1
Fonctionne très bien dans mon script après avoir changé la première ligne en:TMUX=`tmux new-session -d -s name`
Michael Robinson
17

Toutes les commandes que vous pouvez lancer au sein de votre terminal, comme tmux new -s sessionNamepeuvent être lancées de l'intérieur tmuxen appuyant sur la touche de déclenchement (ex:) ctrl-bpuis :puis la commande sans le démarragetmux partie de .

En conséquence, ctrl-b :suivi de new -s sessionNamefera exactement ce que vous voulez et donnez un nom à votre session. Il passe également automatiquement à la nouvelle session.

Morlock
la source
10

Vous pouvez essayer d' unset TMUXabord, cela fonctionne pour moi.

Xiao Hanyu
la source
7

sur les conseils de user2354696, j'utilise les raccourcis clavier suivants pour créer une nouvelle session ou "cloner" une session existante

bind-key N run-shell 'TMUX = tmux nouvelle-session -d \; commutateur-client -n '
bind-key C run-shell 'TMUX = tmux nouvelle-session -t $ (tmux affichage-message -p #S) -s $ (tmux affichage-message -p # S-clone) -d \; commutateur-client -n \; affichage-message "session #S clonée" '
user1384039
la source