Chạy hoặc gửi lệnh đến khung tmux trong phiên chạy tmux


60

Tôi muốn viết một tập lệnh shell sẽ đính kèm vào một phiên tmux có tên, chọn một cửa sổ (hoặc khung) trong phiên đó và chạy một lệnh trong cửa sổ đã chọn (hoặc khung) đó.

Làm thế nào để tôi làm điều này từ một kịch bản bash?

tôi biết

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

cho phép tôi gửi lệnh đến một cửa sổ mới tạo, nhưng tôi cần một cái gì đó như

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

Tôi cho rằng tôi có thể sử dụng send-keysnhưng có vẻ như cần phải có thứ gì đó nhận lệnh hoặc danh sách các lệnh được chạy.

Câu trả lời:


82

Mỗi khung tmux là một giao diện cho một pty (pseudo tty). Cửa sổ không phân chia có một khung duy nhất; cửa sổ chia có nhiều tấm.

tmux không cung cấp một cách để thêm các quy trình bổ sung vào một khung khi nó đã được bắt đầu với lệnh ban đầu của nó. Tùy thuộc vào quy trình của lệnh ban đầu (thường là shell) để cung cấp điều khiển công việc 1 cho thiết bị đầu cuối đó.

Nếu bạn muốn ghi đè bất cứ thứ gì hiện đang chạy trong khung, bạn có thể sử dụng respawn-pane -kđể hủy lệnh hiện có và thay thế nó bằng một lệnh mới (ví dụ respawn-pane -t sessionname:0.4 -k 'some -new command':).

Nhưng, nếu bạn muốn duy trì bất cứ thứ gì hiện đang chạy trong khung, thì có thể không có tùy chọn nào tốt hơn mà chỉ đơn giản là gõ gõ vào nó send-keys.

Bạn có thể viết kịch bản như thế này (đính kèm lần cuối, vì nếu không thì tập lệnh sẽ chỉ chờ bạn tách ra trước khi tiếp tục):

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"

Lưu ý rằng, trên send-keyslệnh, bạn thực sự nên gõ các chữ cái E n t e r, để nói tmuxđể gửi một khóa dòng mới đến cửa sổ. (Đương nhiên, mọi lệnh kết thúc bằng Enterphím.)


1 Kiểm soát công việc là phân xử giữa nhiều nhóm quy trình của một phiên sử dụng tty làm thiết bị đầu cuối kiểm soát. Tức là, Ctrl+ Zngưng trọng, và jobs, fgbgvỏ lệnh.


2
Cảm ơn vì điều đó! Tôi đặt #{session_name}:#{window_index}.#{pane_index}trong dòng trạng thái của mình để tôi có thể nhanh chóng xem khung nào sẽ gửi lệnh đến.
một mọt sách được trả tiền vào

11

Bạn có thể sử dụng C-mthay vì Enter. Đó là một thứ tương tự. Ngoài ra, tmuxlàm cho nó dễ dàng gửi đến khung bên phải / bên trái bằng cách sử dụng -t righthoặc -t left. Và nếu bạn muốn giải quyết một khung trong một cửa sổ khác, chỉ cần thêm tiền tố vào đó với số và thời gian của cửa sổ, như thế -t 0.right.

Bây giờ bạn có thể viết một hàm Bash đơn giản để lấy chuỗi các khóa làm đối số và gửi nó đến khung mục tiêu một cách dễ dàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.