Buat sesi tmux baru dari dalam sesi tmux

105

Saya menulis skrip shell yang membuat / melampirkan atau beralih ke sesi tertentu, tergantung pada apakah ada di dalam tmux dan sesi tersebut ada.

Saya memiliki semuanya bekerja dengan baik kecuali untuk kasus yang membutuhkan pembuatan sesi tmux baru dari dalam sesi tmux.

Ketika skrip saya dijalankan tmux new-session -s name, saya mendapatkan output berikut:

sesi harus disarangkan dengan hati-hati, hapus $ TMUX untuk memaksa

Saya sebenarnya tidak ingin membuat sesi bersarang, tujuan saya adalah membuat sesi terpisah lainnya dan beralih dari dalam sesi tmux .

Apakah ini mungkin?

Michael Robinson
sumber
2
Sumber daya yang HEBAT bagi pengguna yang menemukan pertanyaan ini: leanpub.com/the-tao-of-tmux/read
0xSheepdog

Jawaban:

142

Cara tercepat (dengan asumsi Anda menggunakan ctrl-bsebagai awalan perintah Anda) adalah:

ctrl-b :new

Untuk membuat sesi baru, lalu

ctrl-b s

untuk memilih dan melampirkan sesi secara interaktif.

msharp.dll
sumber
5
+1 untuk solusi yang tidak peduli tentang "sesi harus dilakukan dengan hati-hati, hapus $ TMUX untuk memaksa"
Marcin Rogacki
3
dan kemudian Anda dapat mengganti nama sesi Anda:ctrl-b $
nha
21
Dan Ctrl-b :new -s <name>untuk memberi nama pada sesi baru.
Ain Tohvri
32

Cara membuat skrip

Skrip ini akan memeriksa apakah ada sesi. Jika sesi tidak ada, buat sesi baru dan lampirkan padanya. Jika sesi memang ada, tidak ada yang terjadi dan kami lampirkan ke sesi itu. Jangan ragu untuk mengganti `~ / development 'dengan nama proyek.

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

# ~/development

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

Sesi baru dari terminal

Mari buat dua sesi terpisah, daftarkan mereka, lampirkan ke satu dan kemudian dari dalam siklus tmux melalui sesi.

tmux new -s name -dbekerja dari dalam tmux karena kita membuat sesi terpisah baru. Jika tidak, Anda akan mendapatkan kesalahan bersarang.

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

Sesi baru dari dalam tmux

Kami sekarang berada di dalam atau lebih dikenal sebagai terikat pada sesi target kami. Jika kami mencoba membuat sesi baru saat dilampirkan, itu akan menghasilkan kesalahan bersarang.

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

Untuk mengatasi ini, kami membuat sesi terpisah baru. misalnya,

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

Siklus (sakelar) Sesi

  • Prefix ( sesi sebelumnya
  • Prefix ) sesi selanjutnya

catatan: Prefix secara Ctrl-bdefault. Anda dapat mengikat Prefixke Ctrl-adan di Mac OSX Anda dapat mengubah Caps Lock ke ctrlsystem preferences > keyboard > modifier keys

Lampirkan ke sesi menggunakan mode perintah saat berada di dalam tmux

Mencoba melampirkan ke sesi tanpa melepaskannya akan menghasilkan kesalahan.

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

Sebagai gantinya gunakan mode perintah Prefix :lalu ketik attach -t session_namedan tekan enter.

Yonk
sumber
Terima kasih atas jawaban yang sangat lengkap, ini menjawab beberapa pertanyaan saya sekaligus!
mdekkers
24

Menggunakan ini berhasil untuk saya:

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

Di TMUX=baris pertama diperlukan agar tmux tidak membuang sessions should be nested with care, unset $TMUX to forcepesan.


sumber
1
Berfungsi dengan baik pada skrip saya setelah mengubah baris pertama menjadi:TMUX=`tmux new-session -d -s name`
Michael Robinson
17

Semua perintah yang dapat Anda luncurkan dalam terminal Anda, seperti tmux new -s sessionNamedapat diluncurkan dari dalam tmuxdengan menekan tombol pemicu (misalnya ctrl-b:) :lalu perintah tanpa bagian awal tmux.

Akibatnya, ctrl-b :diikuti oleh new -s sessionNameakan melakukan apa yang Anda inginkan dan memberi nama pada sesi Anda. Ini juga beralih secara otomatis ke sesi baru.

Morlock
sumber
10

Anda dapat mencoba unset TMUXdulu, ini berhasil untuk saya.

Xiao Hanyu
sumber
7

atas saran pengguna2354696, saya menggunakan pengikatan kunci berikut untuk membuat sesi baru atau "menggandakan" sesi yang ada

bind-key N run-shell 'TMUX = tmux sesi-baru -d \; switch-client -n '
bind-key C run-shell 'TMUX = tmux sesi-baru -t $ (tmux display-message -p #S) -s $ (tmux display-message -p # S-clone) -d \; switch-client -n \; tampilan-pesan "sesi #S digandakan" '
pengguna1384039
sumber