Erstellen Sie eine neue tmux-Sitzung innerhalb einer tmux-Sitzung

105

Ich schreibe ein Shell-Skript, das eine bestimmte Sitzung erstellt / anfügt oder zu dieser wechselt, je nachdem, ob sich eine in tmux befindet und die Sitzung vorhanden ist.

Ich habe alles gut gemacht, bis auf den Fall, dass eine neue tmux-Sitzung innerhalb einer tmux-Sitzung erstellt werden muss.

Wenn mein Skript ausgeführt wird tmux new-session -s name, erhalte ich die folgende Ausgabe:

Sitzungen sollten sorgfältig verschachtelt und $ TMUX deaktiviert werden

Ich möchte eigentlich keine Sitzungen verschachteln. Mein Ziel ist es, eine weitere separate Sitzung zu erstellen und innerhalb einer tmux-Sitzung zu dieser zu wechseln .

Ist das möglich?

Michael Robinson
quelle
2
Eine großartige Ressource für Benutzer, die diese Frage finden: leanpub.com/the-tao-of-tmux/read
0xSheepdog

Antworten:

142

Der schnellste Weg (vorausgesetzt, Sie verwenden ihn ctrl-bals Befehlspräfix) ist:

ctrl-b :new

So erstellen Sie eine neue Sitzung

ctrl-b s

interaktiv auswählen und an die Sitzung anhängen.

msharp
quelle
5
+1 für eine Lösung, die sich nicht um "Sitzungen sollte mit Sorgfalt verschachtelt werden, deaktivieren Sie $ TMUX, um zu erzwingen"
Marcin Rogacki
3
und dann könnten Sie Ihre Sitzung umbenennen:ctrl-b $
nha
21
Und Ctrl-b :new -s <name>um der neuen Sitzung einen Namen zu geben.
Ain Tohvri
32

So erstellen Sie das Skript

Dieses Skript prüft, ob eine Sitzung vorhanden ist. Wenn keine Sitzung vorhanden ist, erstellen Sie eine neue Sitzung und hängen Sie sie an. Wenn eine Sitzung existiert, passiert nichts und wir hängen an diese Sitzung an. Fühlen Sie sich frei, "~ / development" durch den Projektnamen zu ersetzen.

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

# ~/development

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

Neue Sitzung vom Terminal

Lassen Sie uns zwei getrennte Sitzungen erstellen, sie auflisten, an eine anhängen und dann innerhalb des tmux-Zyklus durch die Sitzungen gehen.

tmux new -s name -dfunktioniert innerhalb von tmux, da wir eine neue getrennte Sitzung erstellen. Andernfalls wird ein Verschachtelungsfehler angezeigt.

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

Neue Sitzung innerhalb von tmux

Wir sind jetzt drinnen oder besser bekannt als an unsere Zielsitzung gebunden . Wenn wir versuchen, eine neue Sitzung zu erstellen, während sie angehängt ist, führt dies zu einem Verschachtelungsfehler.

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

Um dies zu lösen, erstellen wir eine neue getrennte Sitzung. z.B,

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

Sitzungen wechseln (wechseln)

  • Prefix ( vorherige Sitzung
  • Prefix ) nächste Sitzung

Hinweis: Prefix ist Ctrl-bstandardmäßig. Sie können binden Prefixan Ctrl-aund in Mac OSX können Sie Caps ctrl Sperren ändernsystem preferences > keyboard > modifier keys

Stellen Sie im Befehlsmodus eine Verbindung zu einer Sitzung her, während Sie sich in tmux befinden

Der Versuch, eine Verbindung zu einer Sitzung herzustellen, ohne die Verbindung zu trennen, führt zu einem Fehler.

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

Stattdessen verwenden Sie den Befehl Modus Prefix :geben Sie dann attach -t session_nameund drücken Sie die Eingabetaste.

Yonk
quelle
Vielen Dank für die sehr vollständige Antwort, die einige meiner Fragen auf einmal beantwortet hat!
Mdekkers
24

Dies funktioniert bei mir:

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

Das TMUX=in der ersten Zeile ist erforderlich, damit tmux keine sessions should be nested with care, unset $TMUX to forceNachricht ausgibt .


quelle
1
Funktioniert hervorragend in meinem Skript, nachdem die erste Zeile TMUX=`tmux new-session -d -s name`
Michael Robinson
17

Alle Befehle, die Sie in Ihrem Terminal starten können, tmux new -s sessionNamekönnen von innen tmuxdurch Drücken der Auslösetaste (zB :) ctrl-bund :dann des Befehls ohne Startteil gestartet werden tmux.

Infolgedessen wird ctrl-b :gefolgt von new -s sessionNamegenau das tun, was Sie wollen, und Ihrer Sitzung einen Namen geben. Es wird auch automatisch zur neuen Sitzung gewechselt.

Morlock
quelle
9

Sie können unset TMUXzuerst versuchen , das funktioniert bei mir.

Xiao Hanyu
quelle
7

Auf Anraten von user2354696 verwende ich die folgenden Tastenkombinationen, um eine neue Sitzung zu erstellen oder eine vorhandene Sitzung zu "klonen"

Bindeschlüssel N Run-Shell 'TMUX = tmux new-session -d \; switch-client -n '
Bindeschlüssel C Run-Shell 'TMUX = tmux neue Sitzung -t $ (tmux Anzeige-Nachricht -p #S) -s $ (tmux Anzeige-Nachricht -p # S-Klon) -d \; switch-client -n \; Display-Nachricht "Sitzung #S geklont" '
user1384039
quelle