Woher weiß ich den aktuellen Sitzungsnamen von tmux, indem ich den Befehl tmux ausführe?

34

Ich schreibe ein Drehbuch. Ich möchte das wirklich wissen. Ich hoffe, die ausführbare tmux-Datei kann mir das sagen.

ich finde

tmux rename <newname>

kann die aktuelle Sitzung umbenennen. Ich kann jedoch keinen Befehl zum Abrufen des eigenen Namens finden.

Jimm Chen
quelle

Antworten:

49

Mit tmux 1.2 (und höher) können Sie die -pOption verwenden display-message, eine Nachricht an stdout auszugeben (anstatt sie einem angehängten Client anzuzeigen):

tmux display-message -p '#S'

#Swird als Sitzungsname formatiert (siehe Beschreibung der status-leftOption in der Manpage).

Chris Johnsen
quelle
+1, viel besser als meine Antwort.
Chepner
Ich weiß wirklich zu schätzen, dass Sie darauf hinweisen, dass dafür tmux 1.2 erforderlich ist, genau die Version, die für das automatische Online-Update von openSUSE 11.3 verfügbar ist.
Jimm Chen
Mit tmux 1.8 wird der Name einer angehängten Sitzung zurückgegeben, auch wenn ich nicht in dieser Sitzung arbeite.
Mihai Danila
Die Antwort von Tim People funktioniert mit tmux 1.8 und höher und geht auf die Punkte ein, die er anspricht. Das ist die bessere Antwort.
Alexandros
8

Ich bin überrascht, dass nach fast fünf Jahren niemand darauf hingewiesen hat, dass keine dieser Antworten angemessen ist. Während beide einwandfrei funktionieren, solange das aktuelle TTY an die einzige tmux-Sitzung auf dem Host angehängt ist, fallen beide Antworten flach, wenn:

  1. Die aktuelle Terminalsitzung ist nicht Teil einer TMUX-Sitzung
  2. Es gibt mehrere angehängte tmux-Sessions

Im ersteren Fall geben beide Antworten hier den Namen der angehängten Sitzung zurück (unabhängig davon, ob das aktuelle tty von dieser Sitzung gesteuert wird). Im letzteren Fall ist das Ergebnis wahrscheinlich unbestimmt oder führt zu mehreren Antworten.

Die richtige Frage sollte lauten: "Wie heißt die tmux-Sitzung, an die meine aktuelle Terminalsitzung angehängt ist?"

Um diese Frage zu beantworten, führen Sie aus:

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}'

Dies funktioniert unabhängig von der Anzahl der TMUX-Sitzungen (angefügt oder anderweitig) und unabhängig davon, ob die aktuelle Terminalsitzung Teil einer TMUX-Sitzung ist oder nicht.

Tim Völker
quelle
1
Gute Antwort. Anstatt jeden Sitzungsnamen zu durchlaufen, um seine Bereiche aufzulisten, können Sie auch die tmux list-panes -a -F '#{pane_tty} #{session_name}'Bereiche jeder Sitzung auflisten. Nicht sicher, wie neu -aist, also YMMV.
Brian Cline
Kam auf diese Frage zurück, nachdem die akzeptierte Antwort verwendet wurde und die hier beschriebenen Probleme aufgetreten sind. Bitte stimme dem zu. Wenn möglich, sollte die akzeptierte Antwort geändert werden.
Alexandros
1
Methode 1 funktioniert einwandfrei, wenn sie mit der Überprüfung der TMUXUmgebungsvariablen kombiniert wird, bevor tmux display-message -p '#S'ein typisches Desktop-Setup ausgeführt wird.
ZeroPhase
8

Erweiterte / korrigierten Antwort des tim-Völker nach don_crissti Kommentar zu Warum ist dies grep -vnicht wie erwartet funktioniert? .

Befehl "$ (tty)" in der Antwort von tim-peoples

| grep "$ (tty)" |

würde in diesem Zusammenhang nicht wie erwartet funktionieren. Es wird eine Zeichenfolge 'not a tty' ausgewertet.

Das Ersetzen durch eine Variable löst dieses Problem.

tty = $ (tty)

...

| grep "$ tty" |

Wenn keine tmux-Sitzungen vorhanden sind, wird der ursprüngliche Code erstellt

"Kein Server läuft unter / tmp / tmux-1000 / default" Fehlermeldung.

Add 2>/dev/nullund der Code würde ausgeführt, ohne die Fehlermeldung auszudrucken.

Geänderter Code lautet wie folgt:

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}'
angenehme Seite
quelle
1
Was ist die Verbesserung? Wenn es notwendig ist, sollten Sie in Betracht ziehen, es als Bearbeitung und nicht als Antwort einzureichen. Um eine gute Antwort zu erhalten, sollten Sie wahrscheinlich einen aussagekräftigeren Text hinzufügen.
Seth
1
@seth, ich wollte einen Kommentar abgeben, hatte aber seltsamerweise nicht genug Anerkennung dafür.
helle Seite
Sie benötigen 50 Ruf, um einen Kommentar abzugeben . Es ist normalerweise keine gute Idee, mit komplexem Code zu kommentieren, da Zeilenumbrüche usw. fehlen. Ihre Bearbeitung hat es meiner Meinung nach zu einer ziemlich guten Antwort gemacht.
Seth
Oh, ich verstehe es jetzt. Das "tty" Problem ist eine heftige Sache. Ich benutze diese Spielzeughülle nicht: D
Tim Peoples
1
@ TimPeoples Während es ein Bash-Problem sein könnte. Bash ist nach wie vor der Standard, um Shell-Skripte für die Kompatibilität auf modernen Terminals zu codieren. Sicher, der Posix-Standard ist ideal. Bash hat jedoch einige Funktionen, die alle fortgeschritteneren Terminals gemeinsam haben. Wenn Sie Bash drücken, sollten die meisten anderen großen Terminals funktionieren. Ich führe nur eine Shell-Überprüfung durch und entdecke eine Reihe von Fehlern und Formatierungsproblemen. (meistens mit alter Syntax anstelle der aktuell beschreibenderen Syntax)
ZeroPhase
4
  • Die Antwort von Chris Johnsen gibt einen Sitzungsnamen zurück, auch wenn von außerhalb eine Abfrage erfolgt.
  • Die Antwort von Bright Side und Tim Peoples geht von a aus tty.

Stattdessen stellte ich fest, dass dies für mich genau funktionierte:

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

Nicht ideal, aber Sie können den Namen der angehängten Sitzung extrahieren mit awk:

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

Das benutzerdefinierte Format ist etwas einfacher zu analysieren als das Standardformat.

chepner
quelle