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

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

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

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

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

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

8 ответов

Решение

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

new-session

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

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

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

tmux attach || tmux new

Как указано в комментариях Петра Викторина, 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.

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

# ~/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 для создания окон и панелей, а также для запуска моих редакторов.

Хотя я считаю, что ответа 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 

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

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

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

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

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

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

tmux attach -t mysesh; or tmux new -s mysesh

(изменить: решение, учитывающее именованные сеансы, упоминается в конце этого ответа)

Я столкнулся с этим вопросом, когда искал конкретный вариант использования, но не смог найти для него решения, поэтому я добавлю сюда свой:

После запуска терминала tmux должен:

  • проверить, есть ли какие-либо непривязанные сеансы, и использовать первый, который он может найти (каждый сеанс будет присоединен только один раз)
  • если нет непривязанных сессий создайте новую

После прочтения справочных страниц tmux и поиска массивов в bash я смог придумать следующую однострочную строку:

       tmux attach -t ${$(tmux list-sessions -F '#{session_name}' -f '#{==:#{session_attached},0}')[1]} || tmux new

Объяснение:

  • tmux attach -t $A: подключиться к сеансу с содержимым переменной A (в нашем случае возвращаемое значение команды list-session + вызов массива-индекса)

  • tmux new: создать новый сеанс

  • вместе ->tmux attach -t $A || tmux new: если не удается подключить tmux, создайте новый сеанс

Следующая часть (наша $A) — поиск неприсоединенного сеанса:

  • A = ${$B[1]}: вернуть второй элемент в списке B (первый всегда кажется пустой строкой)
  • B = tmux list-sessions -F '#{session_name}' -f '#{==:#{session_attached},0}'
    • tmux list-sessions: список всех сеансов
    • tmux list-sessions -F '#{session_name}: -F обозначает формат и-F '#{session_name}'говорит tmux показывать только имя сеанса и ничего больше, когда он выводит список
    • tmux list-sessions -f '#{==:#{session_attached},0}': -f означает фильтр и-f '#{==:#{session_attached},0}'говорит tmux показывать только те элементы списка, где -value равно 0
    • tmux list-sessions -F '#{session_name}' -f '#{==:#{session_attached},0}': оба флага в сочетании будут выводить только имя сеанса и только для тех элементов списка, гдеsession_attached-значение равно 0 (= непривязанные сеансы)

Пример:

Мое приложение предназначалось для WSL, поэтому я добавил его в запуск своего профиля Ubuntu в settings.json терминала Windows:

"commandline": "C:\\Windows\\system32\\wsl.exe -d Ubuntu-22.04 tmux attach -t ${$(tmux list-sessions -F '#{session_name}' -f '#{==:#{session_attached},0}')[1]} || tmux new",

Изменить: если у вас есть ([a-zA-Z]) именованные сеансы, вы можете отсортировать список, чтобы поместить их в начало:tmux attach -t ${$(sort -n <<<"${$(tmux list-sessions -F '#{session_name}' -f '#{==:#{session_attached},0}')[*]}")[1]} || tmux new

Если вы добавитеtmux new -s "primary" ||в начале предыдущей команды он попытается создать сеанс с именем «основной», и если он уже существует, он будет присоединяться к нему только в том случае, если он все еще не подключен, в противном случае он займет еще один неприсоединенный сеанс (приоритет имени над безымянным) или просто создайте новую безымянную сессию, если не осталось неподключенных сессий.

Предупреждение: каждый раз, когда вы запускаете эту команду, а «основной» уже существует, она будет выводить сообщение об ошибке, что не удалось создать сеанс под названием «основной» (виден только на долю секунды)

edit edit: вы можете перенаправить эти сообщения, используя&> /dev/null:

      (tmux new -s primary || tmux new -s secondary || tmux new -s tertiary)  &> /dev/null || tmux attach -t ${$(sort -n <<<"${$(tmux list-sessions -F '#{session_name}' -f '#{==:#{session_attached},0}')[*]}")[1]} || tmux new"
Другие вопросы по тегам