Як створити новий сеанс 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
Тим часом, моє 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)
Себастьян Blask

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'
azat

10
Upvoting , тому що з невеликою підстроюванням це працює з іменованими сесіями: tmux attach -t some_name || tmux new -s some_name. Змініть some_name на $ 1, додайте шебанг та збережіть.
Чезмайстер

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 .


1
Якщо ви збираєтеся використовувати це в чомусь на зразок gnome-terminalкоманди, я б запропонував відмовитися від -sі конкретного імені сеансу, щоб ви не закінчилися КОЖНЕ новим gnome-terminalсеансом, доданим до того ж сеансу. Ви завжди можете вибрати існуючий сеанс, prefix + sпісля відкриття нового терміналу.
dragon788

14

Хоча я вважаю, що відповідь чемпіона достатня для використання 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запустити новий сеанс, якщо його немає, або приєднати автоматично. Я думаю, що це набагато краще, ніж редагувати конфігураційний файл.
pjincz

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.