Jalankan atau kirim perintah ke panel tmux dalam sesi tmux yang sedang berjalan

60

Saya ingin menulis skrip shell yang akan melampirkan ke sesi tmux bernama, pilih jendela (atau panel) di sesi itu dan jalankan perintah di jendela yang dipilih (atau panel).

Bagaimana saya melakukan ini dari skrip bash?

aku tahu

tmux new-window -n:mywindow 'exec something'

memungkinkan saya mengirim perintah ke jendela yang baru dibuat, tapi saya butuh sesuatu seperti

tmux select-window -t:0 'my command'

Saya kira saya bisa menggunakan send-keystetapi sepertinya harus ada sesuatu yang mengambil perintah atau daftar perintah yang dijalankan.

cjroebuck
sumber

Jawaban:

82

Setiap panel tmux adalah antarmuka untuk satu pty (pseudo tty). Jendela yang tidak terbelah memiliki panel tunggal; jendela terpisah memiliki beberapa panel.

tmux tidak menyediakan cara untuk menambahkan proses tambahan ke panel setelah dimulai dengan perintah awal. Terserah proses perintah awal itu (biasanya shell) untuk memasok kontrol pekerjaan 1 untuk terminal itu.

Jika Anda ingin mengalahkan apa pun yang sedang berjalan di panel, Anda dapat menggunakan respawn-pane -kuntuk membunuh perintah yang ada dan menggantinya dengan yang baru (misalnya, respawn-pane -t sessionname:0.4 -k 'some -new command').

Tapi, jika Anda ingin mempertahankan apa pun yang sedang berjalan di panel, maka mungkin tidak ada opsi yang lebih baik yang cukup "mengetik itu" dengan send-keys.

Anda dapat skrip seperti ini (lampirkan yang terakhir, karena jika tidak skrip akan menunggu Anda untuk melepaskan sebelum melanjutkan):

session=whatever
window=${session}:0
pane=${window}.4
tmux send-keys -t "$pane" C-z 'some -new command' Enter
tmux select-pane -t "$pane"
tmux select-window -t "$window"
tmux attach-session -t "$session"

Perhatikan bahwa, pada send-keysperintah, Anda sebenarnya harus mengetikkan huruf E n t e r, untuk memberi tahu tmuxuntuk mengirim kunci baris baru ke jendela. (Secara alami, setiap perintah berakhir dengan Enterkunci.)


1 Kontrol pekerjaan adalah arbitrase antara beberapa grup proses dalam satu sesi yang menggunakan tty sebagai terminal pengendali. Yaitu, Ctrl+ Zmenangguhkan kunci, dan jobs, fg, dan bgshell perintah.

Chris Johnsen
sumber
2
Terima kasih untuk ini! Saya memasukkan #{session_name}:#{window_index}.#{pane_index}baris status saya sehingga saya dapat dengan cepat melihat panel mana untuk mengirim perintah.
seorang nerd yang dibayar
11

Anda bisa menggunakan C-mbukan Enter. Itu adalah hal yang sama. Juga, tmuxmembuatnya mudah untuk mengirim ke panel kanan / kiri dengan menggunakan -t rightatau -t left. Dan jika Anda ingin mengarahkan panel di jendela lain, cukup awali dengan nomor dan periode jendela, seperti -t 0.right.

Sekarang Anda dapat menulis fungsi Bash sederhana untuk mendapatkan urutan kunci sebagai argumen dan mengirimkannya ke panel target dengan mudah.

Aleksey Gureiev
sumber