Как создать новую сессию 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
команда) и приложить к этому.
Как указано в комментариях Петра Викторина, jkoelker и pjincz, вы можете использовать следующую команду для подключения к mySession
если он существует, и создать его, если его нет:
tmux new -A -s mySession
От man tmux
:
new-session
[-AdDEP] [-c
start-directory
] [-F
format
] [-n
window-name
] [-s
session-name
] [-t
group-name
] [-x
width
] [-y
height
] [
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"