Как создать новую сессию tmux, если ее нет

144

Я пытаюсь выяснить, как прикрепить к tmux session если существует именованный сеанс tmux, если нет, я хочу создать новый с заданным именем.

В настоящее время я знаю несколько tmuxкоманд, которые могут частично достичь того, что я ищу, но не ясно, как объединить их вместе, чтобы получить то, что я ищу:

  • tmux attach присоединяется к автоматически существующему сеансу, но выдает ошибки, если сеанс не существует
  • tmux new создает новый сеанс - но он делает это каждый раз, поэтому я не могу оставить его в своем .tmux.conf
  • tmux has-session проверяет, существует ли сеанс - но я не знаю, как сшить его вместе с другими командами

Таким образом, я хотел бы создать скрипт tmux, чтобы это происходило автоматически, вместо того, чтобы создавать его вручную каждый раз, когда мне нужно войти в сеанс.

Как я могу написать автоматический скрипт, чтобы создать новый сеанс tmux (если данное имя сеанса не существует) или присоединиться к имени сеанса (если он существует)?

колокольчик-рапунцель
источник
15
@kzh: Я рассматриваю это как вопрос инструмента программирования, как vim
rampion
6
Я написал еще один возможный ответ на этот вопрос как суть, если кому-то интересно: gist.github.com/chakrit/5004006
chakrit
9
Между тем, my man tmuxговорит: «Флаг -A заставляет новую сессию вести себя как сессия присоединения, если сессия уже существует»
Петр Викторин
1
Для тех, кто пометил это, я должен отметить, что даже модераторы не могут перенести вопросы старше 60 дней на другой сайт. Причины такого ограничения системы объясняются здесь .
Брэд Ларсон
1
@BradLarson, в настоящее время лучший / самый простой способ сделать это - ответ в комментарии, внизу: stackoverflow.com/questions/3432536/… . Большинство пользователей, которые приходят сюда, не смогут найти это. Это, очевидно, очень важный вопрос, как вы можете видеть по количеству голосов. Можно ли открыть этот вопрос, чтобы я мог добавить его в качестве ответа, чтобы новые люди могли найти его?
alpha_989

Ответы:

89

Вы также можете добавить

new-session

к вашему .tmux.conf- это создаст сеанс по умолчанию при запуске сервера.

Затем tmux attachлибо присоединится к текущему сеансу (то есть запущенному серверу), либо создаст новый сеанс (запустите сервер, прочитайте файл конфигурации, выполните new-sessionкоманду) и присоединитесь к нему.

Леонид Шевцов
источник
3
Когда это создает новый сеанс, путь по умолчанию - это мой домашний каталог, а не путь, из которого был вызван tmux.
Ричард Хансен
2
@AB: какой ответ ты имеешь в виду?
Юрген А. Эрхард
Есть ли способ сделать это решить проблему @ RichardHansen? Вызов с текущего пути, кажется, имеет смысл, и если его new-sessionуничтожить, то это кажется реальной проблемой.
Ли Олайвар
2
Это нарушает перезагрузку конфигурации tmux, если вы ее используете ( source-file ~/.tmux.conf)
Себастьян Бласк
11
@SebastianBlask вы можете использовать -Aопцию, new-sessionесли вы называете свою сессию. new-session -A -s mysessionбудет хорошо играть с перезагрузкой конфигурации.
Jkoelker
163

Я понял это ( и указал мне ).

tmux attach || tmux new
колокольчик-рапунцель
источник
28
Ответ на этот вопрос лучше работает для меня , потому что я могу назвать сессию: tmux attach-session -t my-session || tmux new-session -s my-session. Единственная проблема в том, что это не атомарно. В tmux действительно должна быть команда create-or-attach.
Андрей
5
У меня есть следующий псевдоним в Bash -alias tm='tmux attach || tmux new'
Азат
10
Upvoting , потому что с небольшой подстройкой это работает с именованными сессиями: tmux attach -t some_name || tmux new -s some_name. Измените some_name на $ 1, добавьте shebang и сохраните.
Cheezmeister
10
Обратите внимание на тех, кто не знаком с tmux и интересуется newvs new-session: они синонимы, а также attachи attach-session.
Esteis
1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultработает намного лучше и не открывает второй tmux, если вы /bin/killпервый. Единственным недостатком является то, что вам нужно назвать сессии для этого.
Тино
64

Как указано в комментариях Петра Викторина , jkoelker и pjincz , вы можете использовать следующую команду, чтобы присоединиться к mySessionней, если она существует, и создать ее, если ее нет:

 tmux new -A -s mySession

От man tmux:

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

(псевдоним: new)

Создайте новый сеанс с именем session-name.

[...]

-AФлаг делает new-sessionведут себя , как attach-sessionесли session-nameуже существует; в этом случае -Dведет себя как -dв attach-session.

new-sessionподдерживает -Aс tmux-1.8 .

alpha_989
источник
1
Если вы собираетесь использовать это в gnome-terminalкачестве команды, я бы предложил исключить -sи конкретное имя сеанса, чтобы вы не заканчивали КАЖДЫЙ новый gnome-terminalсеанс, присоединенный к тому же сеансу. Вы всегда можете выбрать существующую сессию prefix + sпосле открытия нового терминала.
dragon788
14

Хотя я считаю, что ответа rampion достаточно для использования 1 сеанса, этот скрипт позволяет настроить несколько сеансов:

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

НОТА:

-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

Приспосабливая предложение Алекса включить конфигурацию на основе проекта при запуске, я начал использовать следующее:

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

где tmux-myproject.confмоя серия запуска команд tmux для создания окон и панелей, а также для запуска моих редакторов.

Апт
источник
8

Я использую псевдоним для создания нового сеанса, если это необходимо, и присоединяюсь к сеансу по умолчанию, если он уже существует:

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

Я добавил это в мой .login на моем сервере.

Причина, по которой я это делаю, заключается в том, что я не хочу присоединяться к тому же самому сеансу, я хочу новый сеанс, который использует ту же группу окон.

Это также похоже на бег screen -xRR.

Майкл
источник
2
Если вы часто входите в сеанс и выходите из него, это оставляет много неиспользованных сеансов, как это видно на примере tmux list-sessions.
Anm
Да, это так, я просто убираю их время от времени. Это небольшой недостаток, чтобы получить функциональность, которую я хочу.
Майкл
Привет @ mateusz-piotrowski - Я согласен с правкой, чтобы обернуть мой код в блок кода, но почему бы тебе отредактировать другой текст, чтобы он отличался от того, что я сказал? Извините за комментарий здесь, но я не видел больше нигде.
Майкл
Я не хотел тебя обидеть. Я просто подумал, что вы не можете запустить псевдоним в файле конфигурации, и поэтому, должно быть, это опечатка.
Матеуш Пиотровски
3
Теперь вы можете просто набрать: tmux new -A -s defaultдля запуска нового сеанса, если он не существует, или присоединить автоматически. Я думаю, что это намного лучше, чем редактирование конфигурационного файла.
Пинч
1

Для тех, кто хочет сделать то же самое в fish:

tmux attach -t mysesh; or tmux new -s mysesh
tinyspark
источник