Come creare una nuova sessione di tmux se non esiste


144

Sto cercando di capire come collegarmi a una tmux sessionsessione tmux denominata, se non voglio crearne una nuova con il nome specificato.

Al momento, conosco alcuni tmuxcomandi che possono parzialmente ottenere ciò che sto cercando, ma non è chiaro come combinarli insieme per ottenere ciò che sto cercando:

  • tmux attach si collega a una sessione esistente automaticamente, ma si verifica un errore se non esiste alcuna sessione
  • tmux new crea una nuova sessione, ma lo fa ogni volta, quindi non posso lasciarlo nella mia .tmux.conf
  • tmux has-session verifica se esiste una sessione, ma non so come ricucirla insieme agli altri comandi

Quindi, vorrei creare uno script tmux, in modo che ciò avvenga automaticamente, invece di doverlo creare manualmente ogni volta che devo accedere a una sessione.

Come posso scrivere uno script automatico in modo da creare una nuova sessione di tmux (se un determinato nome di sessione non esiste) o collegarmi a un nome di sessione (se esiste)?


15
@kzh: lo vedo come una domanda di strumento di programmazione, come vim
rampion,

6
Ho scritto un'altra possibile risposta a questa domanda come idea, nel caso in cui qualcuno fosse interessato: gist.github.com/chakrit/5004006
chakrit,

9
Nel frattempo, il mio man tmuxdice: "Il flag -A fa sì che la nuova sessione si comporti come attach-session se il nome della sessione esiste già"
Petr Viktorin,

1
Per coloro che segnalano di spostare questo, dovrei notare che anche i moderatori non possono migrare domande che hanno più di 60 giorni su un altro sito. Le ragioni di questo limite di sistema sono spiegate qui .
Brad Larson

1
@BradLarson, attualmente, l'opzione migliore / più semplice per farlo ha una risposta in un commento, molto in basso: stackoverflow.com/questions/3432536/… . La maggior parte degli utenti che vengono qui non sarà in grado di trovarlo. Questa è ovviamente una domanda molto importante, come puoi vedere dal numero di voti. È possibile aprire questa domanda, così posso aggiungerla come risposta, così le persone nuove possono trovarla?
alpha_989

Risposte:


89

In alternativa, puoi aggiungere

new-session

al tuo .tmux.conf- che creerà una sessione predefinita all'avvio del server.

Quindi tmux attachsi collegherà alla sessione corrente (server in esecuzione, ovvero) o creerà una nuova sessione (avvia il server, legge il file di configurazione, emette il new-sessioncomando) e si allega a quello.


3
Quando questo crea una nuova sessione, il percorso predefinito è la mia directory home, non il percorso da cui è stato invocato tmux.
Richard Hansen,

2
@AB: quale risposta intendi?
Jürgen A. Erhard,

C'è un modo per risolvere questo problema con il problema di RichardHansen? Invocare dal percorso attuale sembra avere più senso, e se lo new-sessiondistrugge allora sembra essere un vero problema.
Lee Olayvar,

2
Questo interrompe il ricaricamento di tmux config nel caso in cui lo si usi ( source-file ~/.tmux.conf)
Sebastian Blask

11
@SebastianBlask è possibile utilizzare l' -Aopzione new-sessionse si assegna un nome alla sessione. new-session -A -s mysessiongiocherà bene con il ricaricamento della configurazione.
Jkoelker,

163

L'ho capito ( e me lo ha fatto notare ).

tmux attach || tmux new

28
Questa risposta funziona meglio per me, perché posso nome della sessione: tmux attach-session -t my-session || tmux new-session -s my-session. L'unico problema è che questo non è atomico. tmux dovrebbe davvero avere un comando create-or-attach.
Andrew,

5
Ho il prossimo pseudonimo in bash -alias tm='tmux attach || tmux new'
azat,

10
Upvoting perché con un piccolo ritocco Questo funziona con sessioni denominate: tmux attach -t some_name || tmux new -s some_name. Cambia some_name in $ 1 aggiungi un shebang e salva.
Cheezmeister

10
Nota a coloro che non hanno familiarità con tmux e che si chiedono di newvs new-session: sono sinonimi e così sono attache attach-session.
Esteis,

1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultfunziona molto meglio e non apre un secondo tmux nel caso tu /bin/killil primo. L'unico aspetto negativo è che è necessario nominare le sessioni per questo.
Tino,

64

Come sottolineato nei commenti di Petr Viktorin , jkoelker e pjincz , è possibile utilizzare il comando seguente per collegarsi mySessionse esiste e per crearlo in caso contrario:

 tmux new -A -s mySession

Da man tmux:

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

(alias: new)

Crea una nuova sessione con il nome session-name.

[...]

La -Abandiera si new-sessioncomporta come attach-sessionse session-nameesistesse già; in questo caso, -Dsi comporta come -da attach-session.

new-sessionha supportato -Ada tmux-1.8 .


1
Se lo utilizzerai in qualcosa come gnome-terminalil comando, ti suggerisco di lasciare il -snome della sessione e quello specifico in modo da non finire con OGNI nuova gnome-terminalsessione associata alla stessa sessione. È sempre possibile selezionare una sessione esistente con prefix + sdopo aver aperto un nuovo terminale.
dragon788,

14

Anche se trovo che la risposta di rampion sia sufficiente per l'utilizzo di 1 sessione, questo script consente di impostare più sessioni:

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

NOTA:

-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 

13

Adattando il suggerimento di Alex per includere la configurazione basata su progetto all'avvio, ho iniziato a utilizzare quanto segue:

# ~/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

dov'è la tmux-myproject.confmia serie di avvio di comandi tmux per creare finestre e riquadri, nonché avviare i miei editor.


8

Uso un alias per creare una nuova sessione, se necessario, e allego alla mia sessione predefinita se esiste già:

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

Ho aggiunto questo al mio .login sul mio server.

Il motivo per cui lo faccio in questo modo è perché non voglio collegarmi alla stessa sessione effettiva, voglio una nuova sessione che utilizza lo stesso gruppo di finestre.

Anche questo è simile alla corsa screen -xRR.


2
Se sei dentro e fuori dalla tua sessione spesso, questo lascia molte sessioni inutilizzate, come visto da tmux list-sessions.
Anm

Sì, lo faccio, li pulisco ogni tanto. È un piccolo inconveniente ottenere la funzionalità che desidero.
Michael,

Ehi @ mateusz-piotrowski - Sono d'accordo con la modifica per racchiudere il mio codice in un blocco di codice, ma perché dovresti modificare l'altro testo per essere diverso da quello che ho detto? Mi dispiace commentare qui, ma non ho visto altrove.
Michael,

Non volevo offenderti. Pensavo solo che non si potesse eseguire un alias in un file di configurazione e quindi deve essere stato un errore di battitura.
Mateusz Piotrowski il

3
Ormai, puoi semplicemente digitare: tmux new -A -s defaultper avviare una nuova sessione se non esiste o collegarti automaticamente. Penso che sia molto meglio che modificare il file di configurazione.
pjincz,

1

Per coloro che vogliono fare la stessa cosa in fish:

tmux attach -t mysesh; or tmux new -s mysesh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.