Создать новый сеанс tmux из сеанса tmux

106

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

У меня все работает отлично, за исключением случая, когда требуется создание нового сеанса tmux из сеанса tmux.

Когда мой скрипт выполняется tmux new-session -s name, я получаю следующий вывод:

сеансы должны быть вложены осторожно, отключите $ TMUX, чтобы

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

Это возможно?

Майкл Робинсон
источник
2
ОТЛИЧНЫЙ ресурс для пользователей, которые находят этот вопрос: Leanpub.com/the-tao-of-tmux/read
0xSheepdog

Ответы:

145

Самый быстрый способ (при условии, что вы используете в ctrl-bкачестве префикса команды):

ctrl-b :new

Чтобы создать новый сеанс, затем

ctrl-b s

для интерактивного выбора и присоединения к сеансу.

msharp
источник
5
+1 за решение, которое не заботится о том, что «сеансы следует вкладывать осторожно, отключите $ TMUX, чтобы принудительно»
Марцин Рогацки
3
а затем вы можете переименовать свою сессию:ctrl-b $
nha
21
И Ctrl-b :new -s <name>дать имя новому сеансу.
Ain Tohvri
33

Как создать сценарий

Этот сценарий проверит, существует ли сеанс. Если сеанс не существует, создайте новый сеанс и подключитесь к нему. Если сеанс существует, ничего не происходит, и мы подключаемся к этому сеансу. Не стесняйтесь заменять `~ / development 'названием проекта.

$ touch ~/development && chmod +x ~/development

# ~/development

tmux has-session -t development
if [ $? != 0 ]
then
  tmux new-session -s development
fi
tmux attach -t development  

Новая сессия с терминала

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

tmux new -s name -dработает изнутри tmux, потому что мы создаем новый отдельный сеанс. В противном случае вы получите ошибку вложенности.

$ tmux new -s development -d
$ tmux new -s foo -d
$ tmux ls
> development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]
> foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]
$ tmux attach -t
$ tmux ls
> development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54] (attached)
> foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]

Новый сеанс из tmux

Теперь мы внутри или более известны как привязанные к нашей целевой сессии. Если мы попытаемся создать новый сеанс во время присоединения, это приведет к ошибке вложенности.

$ tmux new -s bar
> sessions should be nested with care, unset $TMUX to force

Чтобы решить эту проблему, мы создаем новый отдельный сеанс. например,

$ tmux new -s bar -d
$ tmux ls
> development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54] (attached)
> foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]
> bar: 1 windows (created Wed Jan 13 17:19:35 2016) [204x54]

Цикл (переключение) сеансов

  • Prefix ( предыдущая сессия
  • Prefix ) следующая сессия

Примечание: Prefix это Ctrl-bпо умолчанию. Вы можете Prefixвыполнить привязку к Ctrl-aMac OSX, а в Mac OSX вы можете изменить Caps Lock на ctrlsystem preferences > keyboard > modifier keys

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

Попытка подключиться к сеансу без отключения приведет к ошибке.

$ tmux attach -t development
> sessions should be nested with care, unset $TMUX to force

Вместо этого используйте командный режим, Prefix :затем введите attach -t session_nameи нажмите Enter.

Йонк
источник
Спасибо за очень полный ответ, это ответило сразу на несколько моих вопросов!
mdekkers 01
24

Использование этого работает для меня:

TMUX= tmux new-session -d -s name
tmux switch-client -t name

В TMUX=первой строке требуется, чтобы tmux не выводил sessions should be nested with care, unset $TMUX to forceсообщение.


источник
1
Отлично работает в моем сценарии после изменения первой строки на:TMUX=`tmux new-session -d -s name`
Майкл Робинсон,
17

Все команды, которые вы можете запустить в своем терминале, например, tmux new -s sessionNameмогут быть запущены изнутри tmux, нажав кнопку триггера (например:), ctrl-bа :затем команду без начальной tmuxчасти.

В результате, ctrl-b :а затем new -s sessionNameбудет делать именно то, что вы хотите, и дать имя вашей сессии. Он также автоматически переключается на новый сеанс.

Морлок
источник
10

Вы можете unset TMUXсначала попробовать , у меня это работает.

Сяо Ханью
источник
7

по совету пользователя2354696 я использую следующие привязки клавиш для создания нового сеанса или "клонирования" существующего сеанса

ключ привязки N run-shell 'TMUX = tmux new-session -d \; переключатель-клиент -n '
ключ привязки C run-shell 'TMUX = tmux new-session -t $ (tmux display-message -p #S) -s $ (tmux display-message -p # S-clone) -d \; переключатель-клиент -n \; display-message "сеанс #S клонирован" '
пользователь1384039
источник