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`

user1559834
источник
Хороший улов! Документация не синхронизирована с фактическим поведением. Я создал отчет об ошибке для этого.
Дрю Фрэнк
Выпущен патч, который исправляет это, поэтому к следующему выпуску он должен вести себя как рекламируется.
Дрю Франк
Патч в 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 необходим для прикрепления к соответствующему сеансу.

tomberek
источник
1

Что о

tmux attach || tmux new

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

new-session

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

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

Тамара Вийсман
источник
Первое предложение будет прикреплено к текущим подключенным сеансам tmux (аналогично screen -x), чего я хочу избежать. Второе предложение демонстрирует ту же проблему, а также имеет нежелательное последствие создания «дополнительных» сеансов tmux, когда я использую команду исходного файла tmux для перезагрузки конфигурации.
Дрю Фрэнк