So erstellen Sie eine neue tmux-Sitzung, wenn keine vorhanden ist

144

Ich versuche herauszufinden, wie ich tmux sessioneine Verbindung zu einer Sitzung herstellen kann, wenn eine benannte tmux-Sitzung vorhanden ist. Wenn nicht, möchte ich eine neue mit dem angegebenen Namen erstellen.

Derzeit sind mir einige tmuxBefehle bekannt, mit denen teilweise erreicht werden kann, wonach ich suche, aber es ist nicht klar, wie sie miteinander kombiniert werden sollen, um das zu erhalten, wonach ich suche:

  • tmux attach Wird an eine automatisch vorhandene Sitzung angehängt. Fehler treten jedoch auf, wenn keine Sitzung vorhanden ist
  • tmux new erstellt eine neue Sitzung - dies geschieht jedoch jedes Mal, sodass ich sie nicht in meiner belassen kann .tmux.conf
  • tmux has-session testet, ob eine Sitzung existiert - aber ich weiß nicht, wie ich sie mit den anderen Befehlen zusammenfügen soll

Daher möchte ich ein tmux-Skript erstellen, damit dies automatisch geschieht, anstatt es jedes Mal manuell erstellen zu müssen, wenn ich mich bei einer Sitzung anmelden muss.

Wie kann ich ein automatisches Skript schreiben, um eine neue tmux-Sitzung zu erstellen (falls ein bestimmter Sitzungsname nicht vorhanden ist) oder an einen Sitzungsnamen anzuhängen (falls vorhanden)?

Rampion
quelle
15
@kzh: Ich betrachte es als eine Frage des Programmierwerkzeugs, wie vim
rampion
6
Ich habe eine andere mögliche Antwort auf diese Frage als Kern geschrieben, falls jemand interessiert ist: gist.github.com/chakrit/5004006
Chakrit
9
In der Zwischenzeit man tmuxsagt mein : "Das -A-Flag bewirkt, dass sich eine neue Sitzung wie eine Anhangssitzung verhält, wenn der Sitzungsname bereits vorhanden ist"
Petr Viktorin,
1
Für diejenigen, die dies markieren, sollte beachtet werden, dass selbst Moderatoren Fragen, die älter als 60 Tage sind, nicht auf eine andere Site migrieren können. Die Gründe für diese Systembegrenzung werden hier erläutert .
Brad Larson
1
@BradLarson, derzeit wird die beste / einfachste Option dazu in einem Kommentar ganz unten beantwortet: stackoverflow.com/questions/3432536/… . Die meisten Benutzer, die hierher kommen, werden dies nicht finden können. Dies ist offensichtlich eine sehr wichtige Frage, wie Sie an der Anzahl der Stimmen sehen können. Ist es möglich, diese Frage zu öffnen, damit ich sie als Antwort hinzufügen kann, damit neue Leute sie finden können?
Alpha_989

Antworten:

89

Alternativ können Sie hinzufügen

new-session

zu Ihrem .tmux.conf- das erstellt eine Standardsitzung beim Serverstart.

Anschließend tmux attachwird entweder eine Verbindung zur aktuellen Sitzung hergestellt (dh Server ausgeführt) oder eine neue Sitzung erstellt (Server starten, Konfigurationsdatei lesen, new-sessionBefehl ausgeben ) und eine Verbindung zu dieser Sitzung hergestellt .

Leonid Shevtsov
quelle
3
Wenn dadurch eine neue Sitzung erstellt wird, ist der Standardpfad mein Ausgangsverzeichnis und nicht der Pfad, von dem aus tmux aufgerufen wurde.
Richard Hansen
2
@AB: Welche Antwort meinst du?
Jürgen A. Erhard
Gibt es eine Möglichkeit, dieses Problem bei RichardHansen zu lösen? Das Aufrufen vom aktuellen Pfad aus scheint am sinnvollsten zu sein, und wenn dies new-sessionzerstört wird, scheint es ein echtes Problem zu sein.
Lee Olayvar
2
Dies unterbricht das Neuladen der tmux-Konfiguration, falls Sie es verwenden ( source-file ~/.tmux.conf)
Sebastian Blask
11
@SebastianBlask Sie können die -AOption verwenden, um new-sessionIhre Sitzung zu benennen. new-session -A -s mysessionwird gut mit dem Neuladen der Konfiguration spielen.
Jkoelker
163

Ich fand es heraus ( und ließ mich darauf hinweisen ).

tmux attach || tmux new
Rampion
quelle
28
Diese Antwort funktioniert besser für mich, weil ich die Sitzung benennen kann : tmux attach-session -t my-session || tmux new-session -s my-session. Das einzige Problem ist, dass dies nicht atomar ist. tmux sollte wirklich einen Befehl zum Erstellen oder Anhängen haben.
Andrew
5
Ich habe nächsten Alias ​​in Bash -alias tm='tmux attach || tmux new'
Azat
10
Upvoting, da dies mit einer kleinen Änderung bei benannten Sitzungen funktioniert : tmux attach -t some_name || tmux new -s some_name. Ändern Sie some_name in $ 1, fügen Sie einen Shebang hinzu und speichern Sie.
Cheezmeister
10
Hinweis für diejenigen, die mit tmux nicht vertraut sind und sich über newvs wundern new-session: Sie sind Synonyme, und so sind attachund attach-session.
Esteis
1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultfunktioniert weitaus besser und öffnet keinen zweiten tmux, falls Sie /bin/killden ersten haben. Der einzige Nachteil ist, dass Sie die Sitzungen dafür benennen müssen.
Tino
64

Wie in den Kommentaren von Petr Viktorin , jkoelker und pjincz ausgeführt , können Sie den folgenden Befehl verwenden, um mySessionihn anzuhängen, falls vorhanden, und um ihn zu erstellen, wenn er nicht vorhanden ist:

 tmux new -A -s mySession

Von man tmux:

new-session[-AdDEP] [-cstart-directory] [-Fformat] [-nwindow-name] [-ssession-name] [-tgroup-name] [-xwidth] [-yheight] [shell-command]

(alias: new)

Erstellen Sie eine neue Sitzung mit Namen session-name.

[...]

Das -AFlag new-sessionverhält sich so, als attach-sessionob es session-namebereits existiert. in diesem Fall, -Dwie verhält sich -dzu attach-session.

new-sessionhat -Aseit tmux-1.8 unterstützt .

alpha_989
quelle
1
Wenn Sie dies in einem gnome-terminalBefehl verwenden möchten, würde ich vorschlagen, den -sund den spezifischen Sitzungsnamen wegzulassen, damit nicht JEDE neue gnome-terminalSitzung an dieselbe Sitzung angehängt wird. Sie können jederzeit eine vorhandene Sitzung mit auswählen, prefix + snachdem Sie ein neues Terminal geöffnet haben.
Dragon788
14

Obwohl ich finde, dass die Antwort von rampion für die Verwendung einer Sitzung ausreicht, können Sie mit diesem Skript mehrere Sitzungen einrichten:

SESSIONS="work play"

function has-session {
    tmux has-session -t $1 2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        $1
    fi
}

# Configure your sessions here
function session-work
{
    tmux new-session -d -s work
    tmux neww -k -t work:1
}

function session-play
{
    tmux new-session -d -s play
    tmux neww -k -t play:1
}

#
#MAIN 
for x in $SESSIONS
do
    echo $x
    has-session $x
    except session-$x
done

HINWEIS:

-k  --> new-window will not be created if already exists
-d  --> start session or window, but don't attach to it yet
-s  --> name the session
-t  --> specify a target location in the form session:window.pane 
Alex Gaudio
quelle
13

Als ich Alex 'Vorschlag anpasste, die projektbasierte Konfiguration beim Start einzubeziehen, begann ich Folgendes zu verwenden:

# ~/bin/tmux-myproject shell script
# The Project name is also used as a session name (usually shorter)
PROJECT_NAME="myproject"
PROJECT_DIR="~/myproject"

tmux has-session -t $PROJECT_NAME 2>/dev/null
if [ "$?" -eq 1 ] ; then
    echo "No Session found.  Creating and configuring."
    pushd $PROJECT_DIR
    tmux new-session -d -s $PROJECT_NAME
    tmux source-file ~/bin/tmux-${PROJECT_NAME}.conf
    popd
else
    echo "Session found.  Connecting."
fi
tmux attach-session -t $PROJECT_NAME

Wo tmux-myproject.confist meine Startserie von tmux-Befehlen zum Erstellen meiner Fenster und Fenster sowie zum Starten meiner Editoren?

Anm
quelle
8

Ich verwende einen Alias, um bei Bedarf eine neue Sitzung zu erstellen und an meine Standardsitzung anzuhängen, falls diese bereits vorhanden ist:

alias tmuxre='tmux new-session -t default || tmux new-session -s default'

Ich habe dies zu meinem .login auf meinem Server hinzugefügt.

Der Grund, warum ich das so mache, ist, dass ich nicht an dieselbe tatsächliche Sitzung anhängen möchte, sondern eine neue Sitzung, die dieselbe Gruppe von Fenstern verwendet.

Dies ähnelt auch dem Laufen screen -xRR.

Michael
quelle
2
Wenn Sie häufig in und außerhalb Ihrer Sitzung sind, bleiben viele unbenutzte Sitzungen übrig, wie von gesehen tmux list-sessions.
Anm
Ja, das tut es, ich räume sie nur ab und zu auf. Es ist ein kleiner Nachteil, die gewünschte Funktionalität zu erhalten.
Michael
Hey @ mateusz-piotrowski - Ich bin mit der Bearbeitung einverstanden, meinen Code in einen Codeblock zu packen, aber warum sollten Sie den anderen Text so bearbeiten, dass er anders ist als das, was ich gesagt habe? Tut mir leid, hier zu kommentieren, aber ich habe nirgendwo anders gesehen.
Michael
Ich wollte dich nicht beleidigen. Ich dachte nur, Sie könnten keinen Alias in einer Konfigurationsdatei ausführen und es muss ein Tippfehler gewesen sein.
Mateusz Piotrowski
3
Inzwischen können Sie einfach Folgendes eingeben: tmux new -A -s defaultStarten einer neuen Sitzung, wenn diese nicht vorhanden ist, oder automatisches Anhängen. Ich denke, es ist viel besser als die Konfigurationsdatei zu bearbeiten.
pjincz
1

Für diejenigen, die das Gleiche tun möchten in fish:

tmux attach -t mysesh; or tmux new -s mysesh
Tinyspark
quelle