Створіть новий сеанс tmux зсередини сеансу tmux


105

Я пишу сценарій оболонки, який створює / приєднує або переключається на певний сеанс, залежно від того, чи є всередині tmux і чи існує сесія.

У мене все працює чудово, крім випадку, що вимагає створення нового сеансу tmux зсередини сесії tmux.

Коли мій сценарій виконується tmux new-session -s name, я отримую такий результат:

сеанси повинні бути вкладені обережно, скиньте $ TMUX для примушування

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

Чи можливо це?


2
ВЕЛИКИЙ ресурс для користувачів, які знаходять це питання: leanpub.com/the-tao-of-tmux/read
0xSheepdog

Відповіді:


142

Найшвидший спосіб (якщо ви використовуєте ctrl-bяк свій префікс команди):

ctrl-b :new

Щоб створити новий сеанс, значить

ctrl-b s

щоб інтерактивно вибрати та долучити до сеансу.


5
+1 для рішення, яке не хвилює "сеанси слід вкладати обережно, не встановити $ TMUX, щоб змусити"
Marcin Rogacki

3
а потім ви можете перейменувати сеанс:ctrl-b $
Nha

21
І Ctrl-b :new -s <name>дати ім’я новій сесії.
Ain Tohvri

32

Як створити сценарій

Цей скрипт перевірить, чи існує сеанс. Якщо сеансу не існує, створіть новий сеанс та приєднайте до нього. Якщо сеанс існує, нічого не відбувається, і ми приєднуємося до цього сеансу. Замініть `~ / 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 і ви можете змінити 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

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буде зроблено саме те, що ви хочете, і дасть ім’я своєму сеансу. Він також автоматично переключається на новий сеанс.



7

за порадою user2354696, я використовую наступні ключові прив’язки, щоб створити новий сеанс або "клонувати" існуючий сеанс

прив’язуючий ключ N run-shell 'TMUX = tmux new-session -d \; switch-client -n '
bind-ключ C run-shell 'TMUX = tmux new-session -t $ (tmux display-message -p #S) -s $ (tmux display-message -p # S-clone) -d \; перемикач-клієнт -n \; дисплей-повідомлення "сеанс №S клонований" '
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.