Bagaimana saya tahu nama sesi tmux saat ini, dengan menjalankan perintah tmux

34

Saya sedang menulis naskah. Saya sangat ingin tahu ini. Saya harap tmux executable dapat memberitahukan hal ini kepada saya.

saya menemukan

tmux rename <newname>

dapat mengganti nama sesi saat ini. Tetapi saya tidak dapat menemukan perintah untuk mengambil namanya sendiri.

Jimm Chen
sumber

Jawaban:

49

Dengan tmux 1.2 (dan lebih baru), Anda dapat menggunakan -popsi display-messageuntuk menampilkan pesan ke stdout (alih-alih menampilkannya ke klien yang dilampirkan):

tmux display-message -p '#S'

#Sdiformat sebagai nama sesi (lihat deskripsi status-leftopsi di halaman manual).

Chris Johnsen
sumber
+1, jauh lebih baik daripada jawaban saya.
chepner
Saya sangat menghargai bahwa Anda menunjukkan bahwa ini memerlukan tmux 1.2, yang merupakan versi persisnya yang tersedia untuk pembaruan online online openSUSE 11.3.
Jimm Chen
Dengan tmux 1.8, ini mengembalikan nama sesi terlampir bahkan ketika saya tidak bekerja di sesi itu.
Mihai Danila
Jawaban Tim People di bawah ini berfungsi dengan tmux 1.8 dan yang lebih baru, serta membahas poin yang ia ajukan. Itu jawaban yang lebih baik.
Alexandros
8

Saya terkejut bahwa, setelah hampir 5 tahun, tidak ada yang menunjukkan bahwa kedua jawaban ini tidak memadai. Meskipun keduanya berfungsi dengan baik selama TTY saat ini melekat pada satu-satunya sesi tmux pada host, jawaban ini keduanya gagal jika:

  1. sesi terminal saat ini bukan bagian dari sesi tmux, atau
  2. ada beberapa sesi tmux terlampir

Dalam kasus sebelumnya, kedua jawaban di sini melaporkan kembali nama sesi terlampir (terlepas dari apakah tty saat ini diatur oleh sesi itu). Dalam kasus terakhir, hasilnya cenderung tidak pasti atau akan menghasilkan beberapa jawaban.

Pertanyaan yang semestinya adalah, "Apa nama sesi tmux tempat sesi terminal saya saat ini dilampirkan?"

Karena ia menjawab bahwa pertanyaan, jalankan:

for s in $(tmux list-sessions -F '#{session_name}'); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$(tty)" | awk '{print $2}'

Ini berfungsi terlepas dari jumlah sesi tmux (terpasang atau tidak) dan terlepas dari apakah sesi terminal saat ini adalah atau bukan bagian dari sesi tmux.

Tim Peoples
sumber
1
Jawaban yang bagus Daripada mengulangi setiap nama sesi untuk membuat daftar panelnya, Anda juga dapat menggunakan tmux list-panes -a -F '#{pane_tty} #{session_name}'untuk membuat daftar setiap sesi sesi. Tidak yakin seberapa baru -a, jadi YMMV.
Brian Cline
Kembali ke pertanyaan ini setelah menggunakan jawaban yang diterima dan gagal sesuai masalah yang dijelaskan di sini. Harap pilih ini. Jika memungkinkan, jawaban yang diterima harus diubah.
Alexandros
1
Metode 1 berfungsi dengan baik jika dikombinasikan dengan memeriksa TMUXvariabel lingkungan sebelum berjalan tmux display-message -p '#S'untuk pengaturan desktop biasa.
ZeroPhase
8

Jawaban tim-orang yang diperpanjang / dikoreksi sesuai komentar don_crissti tentang Mengapa ini grep -vtidak berfungsi seperti yang diharapkan? .

"$ (tty)" perintah dalam jawaban tim-people

| grep "$ (tty)" |

tidak akan bekerja dalam konteks itu seperti yang diharapkan. Ini mengevaluasi ke string 'bukan tty'.

Menggantinya dengan variabel memecahkan masalah ini.

tty = $ (tty)

...

| grep "$ tty" |

Juga, ketika tidak ada sesi tmux, kode asli akan dihasilkan

"tidak ada server yang berjalan pada pesan kesalahan / tmp / tmux-1000 / default" .

Tambah 2>/dev/nulldan kode akan berjalan tanpa mencetak pesan kesalahan.

Kode yang dimodifikasi dibaca sebagai:

tty=$(tty)
for s in $(tmux list-sessions -F '#{session_name}' 2>/dev/null); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$tty" | awk '{print $2}'
sisi terang
sumber
1
Apa perbaikannya? Jika perlu, Anda harus mempertimbangkan untuk mengirimkannya sebagai hasil edit daripada jawaban. Untuk membuatnya menjadi jawaban yang baik, Anda mungkin harus mempertimbangkan untuk menyertakan beberapa teks yang lebih deskriptif.
Seth
1
@seth, saya ingin berkomentar tetapi anehnya tidak memiliki kredit yang cukup untuk melakukannya.
sisi terang
Anda perlu 50 reputasi untuk berkomentar . Biasanya bukan ide yang baik untuk berkomentar dengan kode rumit karena Anda tidak memiliki jeda baris dan sebagainya. Hasil edit Anda menjadikannya jawaban IMHO yang cukup bagus.
Seth
Oh, aku mengerti sekarang. Masalah "tty" adalah masalah besar. Saya tidak menggunakan cangkang mainan itu: D
Tim Peoples
1
@TimPeoples Meskipun mungkin masalah Bash. Bash masih menjadi standar untuk mengkode skrip shell agar tidak kompatibel pada terminal modern. Tentu, standar posix ideal; tetapi, bash memiliki beberapa fitur yang dimiliki oleh semua terminal yang lebih canggih. Dengan memukul Bash, sebagian besar terminal utama lainnya seharusnya berfungsi. Saya baru saja menjalankan pemeriksaan shell dan menangkap banyak kesalahan buruk dan memformat masalah. (kebanyakan menggunakan sintaks lama menggantikan sintaksis yang lebih deskriptif saat ini)
ZeroPhase
4
  • Jawaban Chris Johnsen mengembalikan nama sesi bahkan ketika meminta dari luar satu.
  • Jawaban sisi terang dan Tim Peoples berasumsi a tty.

Alih-alih, saya menemukan ini berfungsi secara akurat untuk saya:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi
dset0x
sumber
3

Tidak ideal, tetapi Anda dapat mengekstrak nama sesi terlampir dengan awk:

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

Format khusus sedikit lebih mudah diurai daripada standar.

chepner
sumber