Tmux эквивалент «экрана -R»?


10

Команда tmux attachдействует больше как комбинация screen -rи screen -x- сначала она пытается присоединиться к самому последнему отключенному сеансу, а затем, если ничего не доступно, она присоединится к текущему присоединенному сеансу. Я хочу эмулировать поведение screen -R: сначала попытайтесь подключиться к отдельному сеансу, затем начните новый сеанс, если не было отключенных сеансов. Каков наилучший способ добиться этого в tmux?

Ответы:


12

После консультаций с мастерами IRC я ​​уверен, что ни одна команда tmux не имеет такого поведения. К счастью, это довольно легко эмулировать с помощью оболочки:

(tmux ls | grep -vq attached && tmux at) || tmux

Незначительное редактирование, чтобы подавить вывод «не удалось подключиться к серверу: соединение отказано» в случае, если вы запускаете новый сеанс:(tmux ls 2>/dev/null | grep -vq attached && tmux at) || tmux
18

3

Несмотря на то, что сказано в руководстве tmux:

             The target-session rules for attach-session are slightly
         adjusted: if tmux needs to select the most recently used session,
         it will prefer the most recently used unattached session.

Ответ Дрю не будет работать должным образом в такой ситуации:

0: 1 windows (created Wed Nov  7 23:51:08 2012) [177x47]
1: 1 windows (created Wed Nov  7 23:51:33 2012) [177x47] (attached)

tmux atприсоединится к последнему сеансу (# 1) (даже если этот сеанс все еще прикреплен где-то еще). Это разрушает саму идею запуска нескольких сеансов tmux и присоединения только к отдельному (использовать mosh + tmux + iterm2 для создания идеального роумингового терминала).

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

tmux ls | grep -vq attached && tmux at `tmux ls | grep -vm1 attached | cut -d: -f1`


Хороший улов! Документация не синхронизирована с фактическим поведением. Я создал отчет об ошибке для этого.
Дрю Фрэнк

Выпущен патч, который исправляет это, поэтому к следующему выпуску он должен вести себя как рекламируется.
Дрю Франк

Патч в 1.8?
momeara

2

Я имею тенденцию проводить только две сессии tmux одновременно, поэтому я делаю что-то подобное в каждом окне терминала.

окно терминала 0:

tmux attach -t 0 || tmux new

окно терминала 1:

tmux attach -t 1 || tmux new

2

Это сработало лучше для меня:

if [ -z "$TMUX" ]; then
     (tmux ls | grep -vq attached && tmux at -t `tmux ls | grep -vm1 attached | cut -d: -f1`) || tmux new
fi

-T необходим для прикрепления к соответствующему сеансу.


1

Что о

tmux attach || tmux new

или вместо этого просто создайте файл, ~/.tmux.confесли он не существует, и добавьте

new-session

так, что он создает новый сеанс, когда нет ни одного при запуске tmux attach.

Также может быть полезно сделать tmuxпсевдоним для tmux attach.


Первое предложение будет прикреплено к текущим подключенным сеансам tmux (аналогично screen -x), чего я хочу избежать. Второе предложение демонстрирует ту же проблему, а также имеет нежелательное последствие создания «дополнительных» сеансов tmux, когда я использую команду исходного файла tmux для перезагрузки конфигурации.
Дрю Фрэнк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.