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


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

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

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

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

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

7 117

7 ответов:

поочередно, вы можете добавить

new-session

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

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

я поняла (и если бы он указал мне).

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.

[...]

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

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

хотя я нахожу ответ rampion достаточным для использования 1 сеанса, этот скрипт позволяет настроить несколько сеансов:

SESSIONS="work play"

function has-session {
    tmux has-session -t  2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        
    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 

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

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

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

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

я добавил Это к моему .войти на мой сервер.

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

Это также похоже на запуск screen -xRR.

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

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