Як запустити tmux з вкладення, якщо сеанс існує


92

Якщо я користуюся

tmux attach

Я можу долучитися до запущеного сеансу, але якщо сеанс не працює, я отримую лише помилку

no sessions

Як я можу автоматично запустити новий сеанс, якщо він не працює? щось на зразок

tmux attach-or-create-new-session

Відповіді:


51

Відповідь набагато простіша. Просто покладіть це у свій ~/.tmux.confфайл:

# if run as "tmux attach", create a session if one does not already exist
new-session -n $HOST

Якщо ви запустите tmux attachі є сеанс, він буде приєднаний до цього сеансу (незалежно від того, додається він чи ні). Якщо НЕ сеанс вже тоді він буде створювати для вас.


11
це акуратний трюк, але є застереження: якщо tmuxйого викликати без аргументів, він створить новий сеанс, а потім створить другий сеанс, як тільки він досягне цієї лінії у вашому ~/.tmux.conf. Ви можете побачити цю проблему, виконавши tmux lsпісля створення першого сеансу. На практиці після того, як ви помістите це у свій файл, ви вже не можете зателефонувати tmuxбез аргументів
Бруно Полако,

4
Тож вам доведеться додати псевдонім, alias tmux="tmux attach"щоб запобігти цій проблемі
rubo77

@BrunoPolaco: який великий застереження з додатковим порожнім сеансом tmux, який працює весь час (крім того, що він не виглядає охайним у списку завдань)?
rubo77

@ rubo77 Ресурси. Деякі люди мають кілька інструментів за замовчуванням, вікон, панелей тощо, створених під час запуску tmux.
rovr138

129

Якщо іменування вашого сеансу добре, це легко зробити за допомогою new-sessionкоманди:

tmux new-session -A -s main

де mainназва сесії, до якої буде додано або створено за потреби.

Від man tmux:

-AПрапор робить new-sessionсебе як attach-sessionякщо сесія ім'я вже існує; в цьому випадку -Dповодиться як -dв attach-session.

Також врахуйте, що -Aопція введена у версії tmux 1.8з 26 березня 2013 року , для більш ранніх версій використовуйте tmux attach || tmux.


10
+1 за використання вбудованої функціональності та надання фрагмента
докуму для

1
У моєму списку псевдонімів: alias "tmux-attach-or-create-main-session=tmux new-session -A -s main". Дякую за пораду! Сторінка посібника: openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Jeroen Wiert Pluimers

tmux: unknown option -- AЗдається, це є лише в останніх версіях.
xApple

Це метод, який я використовував, але ви більше не можете використовувати "tmux detach". Вам потрібно скористатися ярликом <ctrl> b - d для збереження та виходу з існуючого сеансу.
Джесс

2
[ -z "$TMUX" ] && exec tmux new -As .це те, що я використовую в своєму .bashrc.
ryenus

30

Це почне новий сеанс, якщо вкладення помилки:

tmux attach || tmux new

Тож псевдонім зробить роботу:

tm="tmux attach || tmux new"

Ви навіть можете скоротити його, змінивши tmux attachнаtmux a
Бруно Полако

Хоча це функціонально, рішення Веслі Бау використовує вбудовану функціональність tmux, щоб зробити те саме
Арі Патрік

fwiw це здається найкращою відповіддю для старих версій, до введення -A (наприклад, v1.6)
Крістофер Петерсон

3

Розгляньте можливість додати наступне до свого .bashrc

if [ -z "$TMUX" ]; then
    base_session='my_session'
    # Create a new session if it doesn't exist
    tmux has-session -t $base_session || tmux new-session -d -s $base_session
    # Are there any clients connected already?
    client_cnt=$(tmux list-clients | wc -l)
    if [ $client_cnt -ge 1 ]; then
        session_name=$base_session"-"$client_cnt
        tmux new-session -d -t $base_session -s $session_name
        tmux -2 attach-session -t $session_name \; set-option destroy-unattached
    else
        tmux -2 attach-session -t $base_session
    fi
fi

Ви можете бачити моє використання цього в моєму файлі ресурсів ZSH на моїй рефінансі github


2

Щоб розширити відповідь Веслі Бау (що для мене було сеансами подвійного вкладу, коли я використовувався в sudo -s. що я маю у своєму .bashrc:

if [ -z "$TMUX" ] && [ ${UID} != 0 ]
then
    tmux new-session -A -s main
fi

Це перевіряє наявність сеансу tmux і переконуєсь, що ви не є суперпопулярним перед створенням нового сеансу або приєднанням до вже існуючого з назвою main.


1

На це відповів Дрю Френк: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Ось сценарій, який я зараз використовую для цього (хоча я перейшов на екран через іншу проблему з tmux) /somewhere/on/your/path/ttmuxабо як функцію оболонки:

#!/bin/sh
# many thanks to Drew Frank: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r
(tmux ls | grep -vq attached && tmux -2 at) || tmux -2

Ці -2параметри змушують tmux припускати підтримку 256 кольорових терміналів, тому вони можуть не відповідати вашій ситуації.



1

Я трохи покращив @SuperMagic відповідь. Я ставлю цей блок у верхній частині свого.zshrc

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.