tmux-Äquivalent von "screen -R"?

10

Der tmux attachBefehl verhält sich eher wie eine Kombination aus screen -rund screen -x- zuerst wird versucht, eine Verbindung zur zuletzt getrennten Sitzung herzustellen. Wenn keine verfügbar ist, wird eine Verbindung zu einer aktuell angehängten Sitzung hergestellt. Ich möchte das folgende Verhalten emulieren screen -R: Versuchen Sie zunächst, eine Verbindung zu einer getrennten Sitzung herzustellen, und starten Sie dann eine neue Sitzung, wenn keine getrennten Sitzungen vorhanden waren. Was ist der beste Weg, um dies in tmux zu erreichen?

Drew Frank
quelle

Antworten:

12

Nach Rücksprache mit den IRC-Assistenten bin ich überzeugt, dass es keinen einzigen tmux-Befehl gibt, der dieses Verhalten aufweist. Glücklicherweise ist es ziemlich einfach, mit der Shell zu emulieren:

(tmux ls | grep -vq attached && tmux at) || tmux
Drew Frank
quelle
Kleinere Änderungen, um die Ausgabe "Verbindung zum Server fehlgeschlagen: Verbindung abgelehnt" zu (tmux ls 2>/dev/null | grep -vq attached && tmux at) || tmux
unterdrücken,
3

Trotz allem, was im tmux-Handbuch steht:

             The target-session rules for attach-session are slightly
         adjusted: if tmux needs to select the most recently used session,
         it will prefer the most recently used unattached session.

Drews Antwort funktioniert in einer Situation wie der folgenden nicht richtig:

0: 1 windows (created Wed Nov  7 23:51:08 2012) [177x47]
1: 1 windows (created Wed Nov  7 23:51:33 2012) [177x47] (attached)

tmux atwird an die letzte Sitzung angehängt (# 1) (obwohl diese Sitzung noch an einer anderen Stelle angehängt ist). Dies ruiniert die ganze Idee, mehrere tmux-Sitzungen auszuführen und nur an eine getrennte anzuschließen (um mit mosh + tmux + iterm2 ein perfektes Roaming-Terminal zu erstellen).

Ein anderer Ansatz wäre die manuelle Auswahl einer nicht angehängten Sitzung:

tmux ls | grep -vq attached && tmux at `tmux ls | grep -vm1 attached | cut -d: -f1`

user1559834
quelle
Guter Fang! Die Dokumentation stimmt nicht mit dem tatsächlichen Verhalten überein. Ich habe dafür einen Fehlerbericht erstellt .
Drew Frank
Es ist ein Patch erschienen, der dies behebt. Bis zur nächsten Version sollte er sich wie angekündigt verhalten.
Drew Frank
Ist der Patch in 1.8?
Momeara
2

Ich habe normalerweise nur zwei tmux-Sitzungen gleichzeitig, also mache ich so etwas in jedem Terminalfenster.

Terminalfenster 0:

tmux attach -t 0 || tmux new

Terminalfenster 1:

tmux attach -t 1 || tmux new
Charles Witt
quelle
2

Das hat bei mir am besten funktioniert:

if [ -z "$TMUX" ]; then
     (tmux ls | grep -vq attached && tmux at -t `tmux ls | grep -vm1 attached | cut -d: -f1`) || tmux new
fi

Das -t wird benötigt, um eine Verbindung zur richtigen Sitzung herzustellen.

Tomberek
quelle
1

Wie wäre es mit

tmux attach || tmux new

oder erstellen ~/.tmux.confSie stattdessen einfach die Datei, falls sie nicht vorhanden ist, und fügen Sie sie hinzu

new-session

dazu, dass es eine neue Sitzung erstellt, wenn beim Ausführen keine vorhanden ist tmux attach.

Es kann auch nützlich sein, tmuxeinen Alias ​​zu erstellen tmux attach.

Tamara Wijsman
quelle
Der erste Vorschlag würde an aktuell angehängte tmux-Sitzungen (ähnlich wie screen -x) angehängt, was ich vermeiden möchte. Der zweite Vorschlag weist dasselbe Problem auf und hat auch die unerwünschte Folge, dass "zusätzliche" tmux-Sitzungen erstellt werden, wenn ich den Befehl tmux source-file zum erneuten Laden der Konfiguration verwende.
Drew Frank