Cara membuat sesi tmux baru jika tidak ada

144

Saya mencoba mencari cara melampirkan ke tmux sessionjika sesi tmux bernama ada, jika tidak saya ingin membuat yang baru dengan nama yang diberikan.

Saat ini, saya tahu beberapa tmuxperintah yang sebagian dapat mencapai apa yang saya cari, tetapi tidak jelas bagaimana menggabungkannya untuk mendapatkan apa yang saya cari:

  • tmux attach melekat pada sesi yang ada secara otomatis - tetapi kesalahan keluar jika tidak ada sesi
  • tmux new membuat sesi baru - tetapi selalu melakukannya setiap saat, jadi saya tidak bisa membiarkannya di sesi saya .tmux.conf
  • tmux has-session menguji apakah ada sesi - tetapi saya tidak tahu cara menjahitnya bersama dengan perintah lain

Jadi, saya ingin membuat skrip tmux, sehingga ini terjadi secara otomatis, daripada harus membuatnya secara manual setiap kali saya harus masuk ke sesi.

Bagaimana saya bisa menulis skrip otomatis untuk membuat sesi tmux baru (jika nama sesi yang diberikan tidak ada) atau melampirkan ke nama sesi (jika ada)?

rampion
sumber
15
@ kzh: Saya melihatnya sebagai pertanyaan alat pemrograman, seperti vim
rampion
6
Saya telah menulis jawaban lain yang mungkin untuk pertanyaan ini sebagai intisari, kalau-kalau ada yang tertarik: gist.github.com/chakrit/5004006
chakrit
9
Sementara itu, man tmuxkata saya : "Bendera -A membuat sesi baru berperilaku seperti sesi lampiran jika nama sesi sudah ada"
Petr Viktorin
1
Bagi mereka yang menandai untuk memindahkan ini, saya harus perhatikan bahwa bahkan moderator tidak dapat memigrasikan pertanyaan yang berusia lebih dari 60 hari ke situs lain. Alasan batas sistem ini dijelaskan di sini .
Brad Larson
1
@BradLarson, saat ini, pilihan terbaik / paling sederhana untuk melakukan ini dijawab dalam komentar, jalan turun: stackoverflow.com/questions/3432536/… . Sebagian besar pengguna yang datang ke sini tidak akan dapat menemukan ini. Ini jelas pertanyaan yang sangat penting seperti yang Anda lihat dari jumlah suara. Apakah mungkin untuk membuka pertanyaan ini, sehingga saya dapat menambahkannya sebagai jawaban, sehingga orang baru dapat menemukan ini?
alpha_989

Jawaban:

89

Bergantian, Anda dapat menambahkan

new-session

ke .tmux.conf- Anda yang akan membuat sesi default saat server mulai.

Kemudian tmux attachakan melampirkan ke sesi saat ini (menjalankan server, yaitu), atau membuat sesi baru (memulai server, membaca file konfigurasi, mengeluarkan new-sessionperintah) dan melampirkannya.

Leonid Shevtsov
sumber
3
Saat ini membuat sesi baru, jalur default adalah direktori home saya, bukan jalur dari mana tmux dipanggil.
Richard Hansen
2
@ AB: jawaban mana yang Anda maksud?
Jürgen A. Erhard
Apakah ada cara untuk menyelesaikan masalah @ RichardHansen ini? Memohon dari jalan saat ini tampaknya paling masuk akal, dan jika new-sessionmenghancurkannya maka itu tampaknya menjadi masalah nyata.
Lee Olayvar
2
Ini memecah reload tmux reload jika Anda menggunakannya ( source-file ~/.tmux.conf)
Sebastian Blask
11
@SebastianBlask Anda dapat menggunakan -Aopsi ini new-sessionjika Anda memberi nama sesi Anda. new-session -A -s mysessionakan bermain dengan baik dengan memuat ulang konfigurasi.
jkoelker
163

Saya menemukan jawabannya ( dan menunjukkannya kepada saya ).

tmux attach || tmux new
rampion
sumber
28
Jawaban ini bekerja lebih baik bagi saya karena saya dapat nama sesi: tmux attach-session -t my-session || tmux new-session -s my-session. Satu-satunya masalah adalah ini bukan atom. tmux benar-benar harus memiliki perintah create-or-attach.
Andrew
5
Saya memiliki alias berikutnya di bash -alias tm='tmux attach || tmux new'
azat
10
Upvoting karena dengan tweak kecil karya ini dengan nama sesi: tmux attach -t some_name || tmux new -s some_name. Ubah some_name menjadi $ 1 tambahkan shebang, dan simpan.
Cheezmeister
10
Catatan untuk mereka yang tidak terbiasa dengan tmux dan bertanya-tanya tentang newvs new-session: mereka adalah sinonim, dan begitu juga attachdan attach-session.
Esteis
1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultbekerja jauh lebih baik dan tidak membuka tmux kedua jika Anda /bin/killyang pertama. Satu-satunya downside adalah bahwa Anda perlu menyebutkan sesi untuk ini.
Tino
64

Seperti yang ditunjukkan dalam komentar dari Petr Viktorin , jkoelker dan pjincz , Anda dapat menggunakan perintah berikut untuk dilampirkan mySessionjika ada, dan untuk membuatnya jika tidak:

 tmux new -A -s mySession

Dari man tmux:

new-session[-AdDEP] [-cstart-directory] [-Fformat] [-nwindow-name] [-ssession-name] [-tgroup-name] [-xwidth] [-yheight] [shell-command]

(alias: new)

Buat sesi baru dengan nama session-name.

[...]

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

new-sessiontelah mendukung -Asejak tmux-1.8 .

alpha_989
sumber
1
Jika Anda akan menggunakan ini dalam sesuatu seperti gnome-terminalsebagai perintah saya sarankan meninggalkan -sdan nama sesi khusus sehingga Anda tidak berakhir dengan SETIAP gnome-terminalsesi baru yang dilampirkan pada sesi yang sama. Anda selalu dapat memilih sesi yang ada dengan prefix + ssetelah membuka terminal baru.
dragon788
14

Meskipun saya menemukan jawaban rampion cukup untuk menggunakan 1 sesi, skrip ini memungkinkan Anda mengatur beberapa sesi:

SESSIONS="work play"

function has-session {
    tmux has-session -t $1 2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        $1
    fi
}

# Configure your sessions here
function session-work
{
    tmux new-session -d -s work
    tmux neww -k -t work:1
}

function session-play
{
    tmux new-session -d -s play
    tmux neww -k -t play:1
}

#
#MAIN 
for x in $SESSIONS
do
    echo $x
    has-session $x
    except session-$x
done

CATATAN:

-k  --> new-window will not be created if already exists
-d  --> start session or window, but don't attach to it yet
-s  --> name the session
-t  --> specify a target location in the form session:window.pane 
Alex Gaudio
sumber
13

Mengadaptasi saran Alex untuk memasukkan konfigurasi berbasis proyek pada saat startup, saya mulai menggunakan yang berikut:

# ~/bin/tmux-myproject shell script
# The Project name is also used as a session name (usually shorter)
PROJECT_NAME="myproject"
PROJECT_DIR="~/myproject"

tmux has-session -t $PROJECT_NAME 2>/dev/null
if [ "$?" -eq 1 ] ; then
    echo "No Session found.  Creating and configuring."
    pushd $PROJECT_DIR
    tmux new-session -d -s $PROJECT_NAME
    tmux source-file ~/bin/tmux-${PROJECT_NAME}.conf
    popd
else
    echo "Session found.  Connecting."
fi
tmux attach-session -t $PROJECT_NAME

di mana tmux-myproject.confseri startup saya dari perintah tmux untuk membuat jendela dan panel saya, serta memulai editor saya.

Anm
sumber
8

Saya menggunakan alias untuk membuat sesi baru jika diperlukan, dan melampirkan ke sesi default saya jika sudah ada:

alias tmuxre='tmux new-session -t default || tmux new-session -s default'

Saya menambahkan ini ke .login di server saya.

Alasan saya melakukannya dengan cara ini adalah karena saya tidak ingin melampirkan ke sesi aktual yang sama, saya ingin sesi baru yang menggunakan kelompok windows yang sama.

Ini juga mirip dengan berlari screen -xRR.

Michael
sumber
2
Jika Anda sering keluar masuk sesi, ini menyisakan banyak sesi yang tidak digunakan, seperti yang terlihat oleh tmux list-sessions.
Anm
Ya, benar, saya hanya membersihkannya sekarang dan nanti. Ini kelemahan kecil untuk mendapatkan fungsionalitas yang saya inginkan.
Michael
Hey @ mateusz-piotrowski - Saya setuju dengan hasil edit untuk membungkus kode saya dalam blok kode tetapi mengapa Anda mengedit teks lain agar berbeda dari apa yang saya katakan? Maaf untuk berkomentar di sini tapi saya tidak melihat tempat lain untuk.
Michael
Saya tidak bermaksud menyinggung Anda. Saya hanya berpikir Anda tidak bisa menjalankan alias dalam file konfigurasi dan jadi itu pasti salah ketik.
Mateusz Piotrowski
3
Sekarang, Anda bisa mengetik: tmux new -A -s defaultuntuk memulai sesi baru jika tidak ada atau lampirkan secara otomatis. Saya pikir ini jauh lebih baik daripada mengedit file konfigurasi.
pjincz
1

Bagi mereka yang ingin melakukan hal yang sama di fish:

tmux attach -t mysesh; or tmux new -s mysesh
tinyspark
sumber