Jak utworzyć nową sesję tmux, jeśli żadna nie istnieje

144

Próbuję dowiedzieć się, jak dołączyć do, tmux sessionjeśli istnieje nazwana sesja tmux, jeśli nie, chcę utworzyć nową o podanej nazwie.

Obecnie znam kilka tmuxpoleceń, które mogą częściowo osiągnąć to, czego szukam, ale nie jest jasne, jak je połączyć, aby uzyskać to, czego szukam:

  • tmux attach dołącza do automatycznie istniejącej sesji - ale błędy są wyświetlane, jeśli nie ma sesji
  • tmux new tworzy nową sesję - ale robi to za każdym razem, więc nie mogę jej zostawić w swoim .tmux.conf
  • tmux has-session sprawdza, czy sesja istnieje - ale nie wiem, jak ją połączyć z innymi poleceniami

Dlatego chciałbym utworzyć skrypt tmux, aby działo się to automatycznie, zamiast tworzyć go ręcznie za każdym razem, gdy muszę logować się do sesji.

Jak mogę napisać automatyczny skrypt, aby utworzyć nową sesję tmux (jeśli dana nazwa sesji nie istnieje) lub dołączyć do nazwy sesji (jeśli istnieje)?

rampion
źródło
15
@kzh: Uważam to za pytanie dotyczące narzędzia programistycznego, tak jak vim
rampion
6
Napisałem inną możliwą odpowiedź na to pytanie jako sedno, na wypadek gdyby ktoś był zainteresowany: gist.github.com/chakrit/5004006
chakrit
9
W międzyczasie mój man tmuxmówi: „Flaga -A powoduje, że nowa sesja zachowuje się jak sesja dołączania, jeśli nazwa-sesji już istnieje”
Petr Viktorin
1
Dla tych, którzy zgłaszają, że chcą to przenieść, powinienem zauważyć, że nawet moderatorzy nie mogą przenosić pytań starszych niż 60 dni do innej witryny. Przyczyny tego ograniczenia systemowego wyjaśniono tutaj .
Brad Larson
1
@BradLarson, obecnie najlepszą / najprostszą opcją, aby to zrobić, jest komentarz, w dół: stackoverflow.com/questions/3432536/… . Większość użytkowników, którzy tu przyjeżdżają, nie będzie w stanie tego znaleźć. Jest to oczywiście bardzo ważne pytanie, jak widać po liczbie głosów. Czy można otworzyć to pytanie, aby dodać je jako odpowiedź, aby nowe osoby mogły to znaleźć?
alpha_989

Odpowiedzi:

89

Alternatywnie możesz dodać

new-session

do twojego .tmux.conf- spowoduje to utworzenie domyślnej sesji przy starcie serwera.

Następnie tmux attachalbo połączy się z bieżącą sesją (to znaczy działającym serwerem), albo utworzy nową sesję (uruchom serwer, przeczytaj plik konfiguracyjny, wyda new-sessionpolecenie) i dołącz do niej.

Leonid Shevtsov
źródło
3
Kiedy tworzy to nową sesję, domyślną ścieżką jest mój katalog domowy, a nie ścieżka, z której wywołano tmux.
Richard Hansen,
2
@AB: którą odpowiedź masz na myśli?
Jürgen A. Erhard
Czy istnieje sposób, aby rozwiązać ten problem @ RichardHansen? Przywoływanie z obecnej ścieżki wydaje się mieć największy sens, a jeśli to new-sessionniszczy, wydaje się, że jest to prawdziwy problem.
Lee Olayvar,
2
To przerywa ponowne ładowanie konfiguracji tmux w przypadku jej użycia ( source-file ~/.tmux.conf)
Sebastian Blask,
11
@SebastianBlask możesz użyć -Aopcji, new-sessionjeśli nazwiesz swoją sesję. new-session -A -s mysessionbędzie się dobrze bawić przy przeładowywaniu konfiguracji.
jkoelker
163

Rozgryzłem to ( i wskazałem mi ).

tmux attach || tmux new
rampion
źródło
28
Odpowiedź ta działa lepiej dla mnie, bo mogę nazwać sesję: tmux attach-session -t my-session || tmux new-session -s my-session. Jedynym problemem jest to, że nie jest to atomowe. tmux naprawdę powinien mieć polecenie tworzenia lub dołączania.
Andrew
5
Mam następny alias w bash -alias tm='tmux attach || tmux new'
azat
10
Upvoting bo z małym uszczypnąć to działa z nazwanych sesji: tmux attach -t some_name || tmux new -s some_name. Zmień some_name na $ 1, dodaj shebang i zapisz.
Cheezmeister,
10
Uwaga dla tych, którzy nie znają tmux i zastanawiają się nad newvs new-session: są synonimami, podobnie jak attachi attach-session.
Esteis
1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultdziała znacznie lepiej i nie otwiera drugiego tmuxa na wypadek, gdybyś /bin/killbył pierwszym. Jedynym minusem jest to, że w tym celu musisz nazwać sesje.
Tino
64

Jak wskazano w komentarzach Petra Viktorina , jkoelkera i pjincza , możesz użyć następującego polecenia, aby dołączyć do, mySessionjeśli istnieje, i utworzyć je, jeśli tak nie jest:

 tmux new -A -s mySession

Od man tmux:

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

(ps: new)

Utwórz nową sesję o nazwie session-name.

[…]

-AFlag sprawia new-sessionzachowywać jak attach-sessiongdyby session-namejuż istnieje; w tym przypadku -Dzachowuje się jak -dsię attach-session.

new-sessionobsługuje -Aod tmux-1.8 .

alpha_989
źródło
1
Jeśli zamierzasz użyć tego w czymś takim gnome-terminaljak polecenie, sugerowałbym pozostawienie -si konkretną nazwę sesji, aby nie kończyć KAŻDEJ nowej gnome-terminalsesji dołączonej do tej samej sesji. Zawsze możesz wybrać istniejącą sesję prefix + spo otwarciu nowego terminala.
dragon788
14

Chociaż uważam, że odpowiedź rampion jest wystarczająca do korzystania z 1 sesji, ten skrypt pozwala skonfigurować wiele sesji:

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

UWAGA:

-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
źródło
13

Dostosowując się do sugestii Alexa, aby podczas uruchamiania uwzględnić konfigurację opartą na projektach, zacząłem używać następujących elementów:

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

gdzie tmux-myproject.confjest moja startowa seria poleceń tmux, aby utworzyć moje okna i panele, a także uruchomić moje edytory.

Anm
źródło
8

Używam aliasu, aby w razie potrzeby utworzyć nową sesję i dołączam do mojej sesji domyślnej, jeśli już istnieje:

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

Dodałem to do mojego .login na moim serwerze.

Powodem, dla którego robię to w ten sposób, jest to, że nie chcę łączyć się z tą samą rzeczywistą sesją, chcę nową sesję, która używa tej samej grupy okien.

Jest to również podobne do biegania screen -xRR.

Michael
źródło
2
Jeśli często wchodzisz i wychodzisz z sesji, pozostawia to wiele nieużywanych sesji, jak widać tmux list-sessions.
Anm
Tak, to prawda, po prostu je sprzątam od czasu do czasu. Uzyskanie żądanej funkcjonalności jest drobną wadą.
Michael
Hej @ mateusz-piotrowski - zgadzam się z edycją polegającą na zawinięciu mojego kodu w blok kodu, ale dlaczego miałbyś edytować inny tekst, aby był inny niż powiedziałem? Przepraszam za komentarz tutaj, ale nie widziałem nigdzie indziej.
Michael
Nie chciałem cię urazić. Pomyślałem, że nie możesz uruchomić aliasu w pliku konfiguracyjnym, więc musiała to być literówka.
Mateusz Piotrowski
3
W tej chwili możesz po prostu wpisać: tmux new -A -s defaultaby uruchomić nową sesję, jeśli nie istnieje, lub dołączyć automatycznie. Myślę, że to znacznie lepsze niż edycja pliku konfiguracyjnego.
pjincz
1

Dla tych, którzy chcą zrobić to samo w fish:

tmux attach -t mysesh; or tmux new -s mysesh
tinyspark
źródło