Comment connaître le nom actuel de la session tmux, en exécutant la commande tmux

34

J'écris un script. Je veux vraiment savoir ça. J'espère que l'exécutable tmux pourra me le dire.

je trouve

tmux rename <newname>

peut renommer la session en cours. Mais je ne trouve pas de commande pour récupérer son propre nom.

Jimm Chen
la source

Réponses:

49

Avec tmux 1.2 (et versions ultérieures), vous pouvez utiliser l' -poption de display-messagesortie d'un message vers stdout (au lieu de l'afficher sur un client attaché):

tmux display-message -p '#S'

#Sest formaté comme nom de session (voir la description de l' status-leftoption dans la page de manuel).

Chris Johnsen
la source
+1, bien meilleur que ma réponse.
chepner
J'apprécie vraiment que vous souligniez qu'il nécessite tmux 1.2, qui est exactement la version disponible pour la mise à jour en ligne automatique d'openSUSE 11.3.
Jimm Chen
Avec tmux 1.8, cela renvoie le nom d'une session attachée même lorsque je ne travaille pas dans cette session.
Mihai Danila
La réponse de Tim People ci-dessous fonctionne avec tmux 1.8 et versions ultérieures, ainsi que les points qu'il soulève. Telle est la meilleure réponse.
Alexandros
8

Je suis surpris que, après près de 5 ans, personne n'ait signalé qu'aucune de ces réponses n'est adéquate. Bien que les deux fonctionnent correctement tant que le TTY actuel est attaché à la seule session tmux sur l'hôte, ces réponses tombent à plat si:

  1. la session de terminal en cours ne fait pas partie d'une session tmux, ou
  2. il y a plusieurs sessions tmux attachées

Dans le premier cas, les deux réponses rapportent ici le nom de la session jointe (indépendamment du fait que le terminal actuel soit régi par cette session). Dans ce dernier cas, le résultat est probablement indéterminé ou donnera lieu à plusieurs réponses.

La bonne question devrait être: "Quel est le nom de la session tmux à laquelle ma session de terminal actuelle est attachée?"

Pour qu'il réponde à cette question, exécutez:

for s in $(tmux list-sessions -F '#{session_name}'); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$(tty)" | awk '{print $2}'

Cela fonctionne quel que soit le nombre de sessions tmux (attachées ou non) et que la session de terminal en cours fasse ou non partie d'une session tmux.

Tim Peoples
la source
1
Très bonne réponse. Plutôt que de parcourir chaque nom de session pour répertorier ses volets, vous pouvez également utiliser tmux list-panes -a -F '#{pane_tty} #{session_name}'pour répertorier les volets de chaque session. Je ne sais pas à quel point c'est nouveau -a, alors YMMV.
Brian Cline
Je suis revenu à cette question après avoir utilisé la réponse acceptée et échoué selon les problèmes décrits ici. Merci de voter. Si possible, la réponse acceptée doit être modifiée.
Alexandros
1
La méthode 1 fonctionne correctement si elle est combinée avec la vérification de TMUXla variable d'environnement avant l'exécution tmux display-message -p '#S'pour une configuration de bureau typique.
ZeroPhase
8

Extended / corriger la réponse de tim-peuples selon le commentaire de don_crissti sur Pourquoi est - ce grep -vne fonctionne pas comme prévu? .

Commande "$ (tty)" dans la réponse de tim-peuples

| grep "$ (tty)" |

ne fonctionnerait pas dans ce contexte comme prévu. Il évalue une chaîne «pas un tty».

Le remplacer par une variable résout ce problème.

tty = $ (tty)

...

| grep "$ tty" |

De plus, en l'absence de sessions tmux, le code d'origine produirait

Message d'erreur «aucun serveur exécuté sur / tmp / tmux-1000 / default» .

Ajouter 2>/dev/nullet le code s'exécuterait sans imprimer le message d'erreur.

Le code modifié se lit comme suit:

tty=$(tty)
for s in $(tmux list-sessions -F '#{session_name}' 2>/dev/null); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$tty" | awk '{print $2}'
le bon côté
la source
1
Quelle est l'amélioration? Si c'est nécessaire, vous devriez envisager de le soumettre sous forme de modification plutôt que de réponse. Pour en faire une bonne réponse, vous devriez probablement envisager d'inclure un texte plus descriptif.
Seth
1
@seth, je voulais commenter mais curieusement je n'avais pas assez de crédit pour le faire.
côté brillant
Vous avez besoin de 50 points de réputation pour commenter . Ce n'est généralement pas une bonne idée de commenter avec du code complexe car vous manquez de sauts de ligne, etc. Votre modification en a fait une assez bonne réponse à mon humble avis.
Seth
Oh, je comprends maintenant. Le problème "tty" est quelque chose de bash. Je n'utilise pas cette coquille de jouet: D
Tim Peoples
1
@TimPeoples Bien qu'il puisse s'agir d'un problème Bash. Bash est toujours la norme pour coder les scripts shell pour la compatibilité sur les terminaux modernes. Bien sûr, la norme posix est idéale; mais, bash possède certaines fonctionnalités que partagent tous les terminaux les plus avancés. En frappant Bash, la plupart des autres terminaux majeurs devraient simplement fonctionner. Je lance simplement la vérification du shell et détecte un tas d'erreurs et de problèmes de formatage. (principalement en utilisant l'ancienne syntaxe à la place de la syntaxe plus descriptive actuelle)
ZeroPhase
4
  • La réponse de Chris Johnsen renvoie un nom de session même lorsque vous interrogez de l'extérieur.
  • la réponse de Bright Side et de Tim Peoples suppose a tty.

Au lieu de cela, j'ai trouvé que cela fonctionnait correctement pour moi:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi
dset0x
la source
3

Pas idéal, mais vous pouvez extraire le nom de la session jointe avec awk:

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

Le format personnalisé est un peu plus facile à analyser que le format par défaut.

chepner
la source