Utwórz nową sesję tmux z poziomu sesji tmux

106

Piszę skrypt powłoki, który tworzy / dołącza lub przełącza się do danej sesji, w zależności od tego, czy jest w tmux i sesja istnieje.

Mam wszystko, co działa świetnie, z wyjątkiem przypadku wymagającego utworzenia nowej sesji tmux z poziomu sesji tmux.

Kiedy mój skrypt jest wykonywany tmux new-session -s name, otrzymuję następujące dane wyjściowe:

sesje powinny być zagnieżdżane ostrożnie, wyłącz $ TMUX na wymuszenie

Właściwie nie chcę zagnieżdżać sesji, moim celem jest utworzenie kolejnej oddzielnej sesji i przełączenie się na nią z poziomu sesji tmux .

czy to możliwe?

Michael Robinson
źródło
2
WIELKI zasób dla użytkowników, którzy znaleźli to pytanie: leanpub.com/the-tao-of-tmux/read
0xSheepdog

Odpowiedzi:

145

Najszybszym sposobem (zakładając, że użyjesz ctrl-bprefiksu polecenia) jest:

ctrl-b :new

W takim razie aby utworzyć nową sesję

ctrl-b s

do interaktywnego wybierania i dołączania do sesji.

msharp
źródło
5
+1 za rozwiązanie, które nie dba o to, że „sesje powinny być ostrożnie zagnieżdżane, wyłącz $ TMUX na wymuszenie”
Marcin Rogacki
3
a potem możesz zmienić nazwę sesji:ctrl-b $
nha,
21
I Ctrl-b :new -s <name>nadać nazwę nowej sesji.
Ain Tohvri
33

Jak stworzyć skrypt

Ten skrypt sprawdzi, czy sesja istnieje. Jeśli sesja nie istnieje, utwórz nową sesję i dołącz do niej. Jeśli sesja istnieje, nic się nie dzieje i przyłączamy się do tej sesji. Możesz zamienić `~ / development 'na nazwę projektu.

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

# ~/development

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

Nowa sesja z terminala

Stwórzmy dwie odłączone sesje, wypiszmy je, dołączmy do jednej, a następnie z poziomu tmux cykl przez sesje.

tmux new -s name -ddziała od wewnątrz tmux, ponieważ tworzymy nową odłączoną sesję. W przeciwnym razie wystąpi błąd zagnieżdżenia.

$ 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]

Nowa sesja w tmux

Jesteśmy teraz w środku lub lepiej znani jako przywiązani do naszej sesji docelowej. Jeśli spróbujemy utworzyć nową sesję po podłączeniu, spowoduje to błąd zagnieżdżenia.

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

Aby rozwiązać ten problem, tworzymy nową odłączoną sesję. na przykład,

$ 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]

Cykl (przełącznik) sesji

  • Prefix ( poprzednia sesja
  • Prefix ) następna sesja

uwaga: Prefix jest Ctrl-bdomyślnie. Możesz powiązać się Prefixz, Ctrl-aaw Mac OSX możesz zmienić Caps Lock na Ctrlsystem preferences > keyboard > modifier keys

Dołącz do sesji przy użyciu trybu poleceń w tmux

Próba dołączenia do sesji bez odłączania zakończy się błędem.

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

Zamiast tego użyj trybu poleceń, Prefix :a następnie wpisz attach -t session_namei naciśnij Enter.

Yonk
źródło
Dziękuję za bardzo wyczerpującą odpowiedź, to odpowiedziała na kilka moich pytań naraz!
mdekkers
24

U mnie to działa:

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

W TMUX=pierwszym wierszu jest wymagane, aby tmux nie wysyłał sessions should be nested with care, unset $TMUX to forcewiadomości.


źródło
1
Świetnie sprawdza się w moim skrypcie po zmianie pierwszej linii na:TMUX=`tmux new-session -d -s name`
Michael Robinson
17

Wszystkie polecenia, które możesz uruchomić w swoim terminalu, na przykład, tmux new -s sessionNamemożna uruchomić od wewnątrz tmux, naciskając klawisz wyzwalacza (np . ctrl-b:), a :następnie polecenie bez tmuxczęści początkowej .

W rezultacie, ctrl-b :a następnie new -s sessionNamezrobisz dokładnie to, co chcesz i nadasz nazwę swojej sesji. Przełącza się również automatycznie do nowej sesji.

Morlok
źródło
10

Możesz spróbować unset TMUXnajpierw, to działa dla mnie.

Xiao Hanyu
źródło
7

zgodnie z radą użytkownika2354696 używam następujących skrótów klawiszowych do tworzenia nowej sesji lub „klonowania” istniejącej sesji

bind-key N run-shell 'TMUX = tmux nowa-sesja -d \; przełącznik-klienta -n '
bind-key C run-shell 'TMUX = tmux new-session -t $ (tmux display-message -p #S) -s $ (tmux display-message -p # S-clone) -d \; przełącznik-klienta -n \; komunikat na wyświetlaczu "sesja #S sklonowana" '
user1384039
źródło