2010-08-07 4 views
104

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

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

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

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

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

+15

@kzh: Я рассматриваю его как вопрос для инструмента программирования, например vim – rampion

+6

. Я написал еще один возможный ответ на этот вопрос в качестве сущности, если кто-то интересуется: https://gist.github.com/chakrit/5004006 – chakrit

+8

Между тем мой 'man tmux' говорит:« Флаг -A делает сеанс new-session похожим на attach-session, если имя сеанса уже существует » –

ответ

83

В качестве альтернативы, вы можете добавить

new-session 

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

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

+3

Когда это создает новый сеанс, путь по умолчанию - это мой домашний каталог, а не путь, из которого был вызван tmux. –

+0

На самом деле это не решает вопрос, см. Ответ ниже. –

+2

@ A.B: какой ответ вы имеете в виду? –

135

Я понял (and had it pointed out to me).

tmux attach || tmux new 
+23

Этот ответ работает лучше для меня, потому что я могу назвать сеанс: 'tmux attach-session -t my-session || tmux new-session -s my-session'. Единственная проблема - это не атомная. tmux действительно должен иметь команду create-or-attach. – Andrew

+7

@ Randal Schwartz - Пожалуйста, количественно «работает намного лучше» ... – MPT

+4

У меня есть следующий псевдоним в bash - 'alias tm = 'tmux attach || tmux new'' – azat

13

Хотя я нахожу ответ Рэмпиона является достаточным для использования 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 
8

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

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

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

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

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

+2

Если вы часто посещаете сессию и выходите из нее, это оставляет много неиспользуемых сеансов, как видно из 'tmux list-sessions'. – Anm

+0

Да, это так, я просто убираю их время от времени. Это небольшой недостаток, чтобы получить необходимую функциональность. – Michael

+0

Hey @ mateusz-piotrowski - Я согласен с редактированием, чтобы обернуть свой код в блок кода, но почему вы отредактируете другой текст, который будет отличаться от того, что я сказал? Извините, комментарий здесь, но я не видел нигде. – Michael

11

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

# ~/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 команды для создания моих окон и стекол, а также начать мои редактор ,

1

Как было отмечено в комментариях от Petr Viktorin, 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 has supported -A since tmux-1.8.

Смежные вопросы