Tmux - Dapatkan panel # dari setiap panel di jendela dari skrip?

12

Apakah ada cara untuk mengetahui indeks panel dari panel tertentu di Tmux?

Saya tahu saya bisa menjalankan sesuatu seperti:

tmux display-message -p  "#{pane_index}"  

tetapi itu hanya berfungsi pada panel aktif. Saya ingin ini berfungsi untuk panel apa pun yang dijalankan. Biasanya tentu saja sulit untuk menjalankan skrip dalam panel yang bukan panel aktif, tetapi Anda dapat jika Anda menggunakan :set-window-option synchronize-panesuntuk menyinkronkan input antara semua panel.

Bagaimana saya menggunakan ini?

Dalam pekerjaan saya, saya harus terhubung ke beberapa server identik di load balancer pada saat yang sama, yang saya lakukan dengan panel Tmux. Saya biasanya mengaktifkan fitur panel sinkronisasi untuk memungkinkan saya memiliki apa pun yang saya ketik secara identik dikirim ke setiap panel pada saat yang sama. Ini sangat bagus.

Hal yang saya temukan adalah bahwa saya ingin terhubung ke server dan melakukan sesuatu yang unik untuk setiap panel kadang-kadang, menggunakan "pane index" yang sama setiap kali. Misalnya, saya menjalankan perintah seperti ini:

ssh NODE_$(get_pane_number)

yang, ketika disinkronkan dan dijalankan di setiap panel, akan menjalankan perintah berikut di jendela dengan 4 panel:

ssh NODE_0 di panel 0

ssh NODE_1 di panel 1

ssh NODE_2 di panel 2

ssh NODE_3 di panel 3

Tentu saja saya bisa membuat skrip ini, tetapi itu hanya akan berfungsi dengan baik sebelum saya mulai menyinkronkan input. Ada saat-saat ketika saya ingin melakukan ini setelah saya mulai menyinkronkan input juga.

Taman Brad
sumber

Jawaban:

12

tmux (sejak v1.5) menyediakan TMUX_PANE di lingkungan proses yang diluncurkannya untuk sebuah panel; setiap panel baru mendapatkan nilai unik server. Jadi, dengan asumsi bahwa TMUX_PANE tersedia di lingkungan Anda, maka ini harus melakukan apa yang saya pikir Anda inginkan:

tmux display -pt "${TMUX_PANE:?}" '#{pane_index}'

The ${…:?}sintaks di Bourne-seperti mencegah shell perluasan hilang atau kosong parameter. Dalam kasus ini, ekspansi kosong akan kembali ke default menggunakan "panel yang saat ini aktif", yang biasanya — tetapi tidak selalu — sama dengan “panel ini” (mereka mungkin akan berbeda jika perintah tty bukan yang yang tmux mulai, misalnya karena menggunakan naskah atau mengharapkan , dan sebagainya).

Chris Johnsen
sumber
manis! yang benar-benar melakukannya ... sangat dihargai!
Brad Parks
Sintaks "$ {TMUX_PANE :?}" tidak berfungsi di shell ikan
CodyChan
2

Anda bisa mendapatkan semua indeks panel serta banyak informasi lain tentang panel

tmux list-panes -a

Lihat tmux(1)FORMAT untuk mendapatkan daftar informasi yang bisa Anda dapatkan dan kerjakan.

ikrabbe
sumber
1
terima kasih atas umpan baliknya - tetapi ini tidak memberi tahu saya panel mana yang mana - hanya saja ada panel 0-3 di Window, yang saya sudah bisa mengetahuinya. Saya ingin dapat menulis skrip bash yang disebut get_pane_numberyang benar-benar mengembalikan # yang tepat tanpa panel aktif.
Taman Brad
2

Membangun dua solusi yang diusulkan, saya menemukan fungsi ini bekerja untuk saya:

I=$(tmux list-panes -a | grep $TMUX_PANE 2>/dev/null | awk -F: '{print $2}' | awk -F. '{print $2}')

atau hal yang sama dimulai dengan indeks = 1

I=$(($(tmux list-panes -a | grep $TMUX_PANE 2>/dev/null | awk -F: '{print $2}' | awk -F. '{print $2}') + 1))

Ini bukan yang tercantik tetapi berfungsi dan saya bisa menjatuhkannya di saya .bashrcdan hanya menggunakan $Ikapan saja saya butuhkan

Carles Figuerola
sumber