Cara memulai tmux dengan melampirkan jika ada sesi

92

Jika saya gunakan

tmux attach

Saya bisa melampirkan ke sesi berlari tetapi jika tidak ada sesi berjalan, saya hanya mendapatkan kesalahan

no sessions

Bagaimana saya bisa secara otomatis memulai sesi baru jika tidak ada yang berjalan? sesuatu seperti

tmux attach-or-create-new-session
rubo77
sumber
terkait: stackoverflow.com/questions/3432536/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

52

Jawabannya jauh lebih sederhana. Masukkan saja ini ke ~/.tmux.conffile Anda :

# if run as "tmux attach", create a session if one does not already exist
new-session -n $HOST

Jika Anda menjalankan tmux attachdan ada sesi, maka sesi akan dilampirkan ke sesi itu (apakah sudah terlampir atau belum). Jika belum ada sesi maka akan dibuatkan untuk Anda.

Joe Casadonte
sumber
11
ini adalah trik yang rapi, tetapi ada peringatan: jika tmuxdipanggil tanpa argumen, itu akan membuat sesi baru dan kemudian membuat sesi kedua segera setelah mencapai baris ini di Anda ~/.tmux.conf. Anda dapat melihat masalah ini dengan menjalankan tmux lssetelah membuat sesi pertama . Dalam praktiknya, setelah Anda memasukkan ini ke dalam file Anda, Anda tidak dapat menelepon tmuxtanpa argumen lagi
Bruno Polaco
4
Jadi, Anda harus menambahkan alias alias tmux="tmux attach"untuk mencegah masalah ini
rubo77
@BrunoPolaco: apa peringatan besar dengan sesi tmux ekstra kosong yang berjalan sepanjang waktu (selain itu tidak terlihat rapi dalam daftar tugas)?
rubo77
@ rubo77 Sumber Daya. Beberapa orang memiliki beberapa alat default, jendela, panel, dll yang dibuat ketika diluncurkan tmux.
rovr138
129

Jika penamaan sesi Anda baik-baik saja, maka mudah dilakukan dengan new-sessionperintah:

tmux new-session -A -s main

di mana mainnama sesi yang akan dilampirkan atau dibuat jika diperlukan.

Dari man tmux:

The -Aflag membuat new-sessionberperilaku seperti attach-sessionjika sesi-nama sudah ada; dalam hal ini, -Dberperilaku seperti -duntuk attach-session.

Harap perhatikan juga bahwa -Aopsi ini diperkenalkan dalam versi tmux 1.8mulai 26 Maret 2013 , untuk versi sebelumnya, gunakan tmux attach || tmux.

Wesley Baugh
sumber
10
+1 untuk menggunakan fungsionalitas bawaan dan memberikan cuplikan man doc
Ari Patrick
1
Dalam daftar alias saya: alias "tmux-attach-or-create-main-session=tmux new-session -A -s main". Terima kasih atas tipnya! Halaman manual: openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Jeroen Wiert Pluimers
tmux: unknown option -- AIni sepertinya hanya tersedia dalam versi terbaru.
xApple
Ini adalah metode yang saya gunakan, tetapi Anda tidak bisa lagi menggunakan "tmux detach". Anda perlu menggunakan pintasan <ctrl> b - d untuk menyimpan dan keluar dari sesi yang ada.
Jess
2
[ -z "$TMUX" ] && exec tmux new -As .ini yang saya gunakan di blog saya .bashrc.
ryenus
30

Ini akan memulai sesi baru jika lampiran memberikan kesalahan:

tmux attach || tmux new

Jadi alias akan melakukan pekerjaan:

tm="tmux attach || tmux new"
rubo77
sumber
Anda bahkan dapat membuatnya lebih pendek dengan mengganti tmux attachuntuktmux a
Bruno Polaco
Meskipun ini fungsional, solusi Wesley Baugh menggunakan fungsionalitas built-in tmux untuk melakukan hal yang sama
Ari Patrick
fwiw ini sepertinya jawaban terbaik untuk versi yang lebih lama, sebelum -A diperkenalkan (mis. v1.6)
Christopher Peterson
3

Pertimbangkan untuk menambahkan yang berikut ke .bashrc

if [ -z "$TMUX" ]; then
    base_session='my_session'
    # Create a new session if it doesn't exist
    tmux has-session -t $base_session || tmux new-session -d -s $base_session
    # Are there any clients connected already?
    client_cnt=$(tmux list-clients | wc -l)
    if [ $client_cnt -ge 1 ]; then
        session_name=$base_session"-"$client_cnt
        tmux new-session -d -t $base_session -s $session_name
        tmux -2 attach-session -t $session_name \; set-option destroy-unattached
    else
        tmux -2 attach-session -t $base_session
    fi
fi

Anda dapat melihat penggunaan ini dalam file sumber daya ZSH saya di repo github saya

sparticvs
sumber
2

Untuk memperluas jawaban Wesley Baugh (yang merupakan sesi bersarang ganda untuk saya ketika digunakan dalam .bashrc saat masuk) dan menambahkan sedikit fleksibilitas karena saya sering menggunakan sudo -sserver (yang dengan patuh memuat .bashrc saya lagi dan sarang ganda), inilah apa yang saya miliki di .bashrc saya:

if [ -z "$TMUX" ] && [ ${UID} != 0 ]
then
    tmux new-session -A -s main
fi

Ini memeriksa untuk sesi tmux dan memastikan Anda tidak superuser sebelum membuat sesi baru atau melampirkan ke yang sudah ada yang bernama main.

Celsius1414
sumber
1

Drew Frank menjawab ini di sini: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Inilah skrip yang sekarang saya gunakan untuk ini (walaupun, saya telah beralih kembali ke layar karena masalah lain dengan tmux) /somewhere/on/your/path/ttmuxatau sebagai fungsi shell:

#!/bin/sh
# many thanks to Drew Frank: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r
(tmux ls | grep -vq attached && tmux -2 at) || tmux -2

The -2pilihan membuat tmux berasumsi 256 dukungan terminal warna, sehingga mereka mungkin tidak sesuai untuk situasi Anda.

SuperMagic
sumber
1

Saya sedikit memperbaiki pada jawaban @SuperMagic. Saya meletakkan blok ini di bagian atas.zshrc

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi
cmcginty
sumber