Tmux - Nhận khung # của mỗi ô trong một cửa sổ từ tập lệnh?


12

Có cách nào để tìm ra chỉ mục khung của một khung cụ thể trong Tmux không?

Tôi biết tôi có thể chạy một cái gì đó như:

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

nhưng điều đó chỉ hoạt động trên khung hoạt động. Tôi muốn nó hoạt động cho bất kỳ khung nào nó chạy. Thông thường tất nhiên là khó chạy tập lệnh trong khung không phải là khung hoạt động, nhưng bạn có thể nếu bạn sử dụng :set-window-option synchronize-panesđể đồng bộ hóa đầu vào giữa tất cả các bảng.

Làm thế nào tôi sẽ sử dụng này?

Trong công việc của mình, tôi cần kết nối với nhiều máy chủ giống hệt nhau trong một bộ cân bằng tải cùng một lúc, điều mà tôi làm với các bảng Tmux. Tôi thường bật tính năng panes đồng bộ hóa để cho phép tôi có bất cứ thứ gì tôi gõ giống hệt nhau được gửi đến từng khung cùng một lúc. Điều này làm việc tuyệt vời.

Điều tôi tìm thấy là đôi khi tôi muốn kết nối với các máy chủ và làm một cái gì đó duy nhất cho mỗi khung, sử dụng cùng một "chỉ mục khung" mỗi lần. Ví dụ: tôi sẽ chạy một lệnh như vậy:

ssh NODE_$(get_pane_number)

trong đó, khi được đồng bộ hóa và chạy trong mỗi khung, sẽ chạy các lệnh sau trong một cửa sổ với 4 ô:

ssh NODE_0 trong khung 0

ssh NODE_1 trong khung 1

ssh NODE_2 trong khung 2

ssh NODE_3 trong khung 3

Tất nhiên tôi có thể viết kịch bản này, nhưng nó chỉ hoạt động tốt trước khi tôi bắt đầu đồng bộ hóa đầu vào. Đôi khi tôi cũng muốn làm điều này sau khi tôi cũng bắt đầu đồng bộ hóa đầu vào.

Câu trả lời:


12

tmux (kể từ v1.5) cung cấp TMUX_Pane trong môi trường của quy trình mà nó khởi chạy cho một khung; mỗi khung mới có một giá trị duy nhất cho máy chủ. Vì vậy, giả sử rằng TMUX_Pane có sẵn trong môi trường của bạn, thì điều này sẽ làm những gì tôi nghĩ bạn muốn:

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

Các ${…:?}cú pháp trong một Bourne giống như ngăn chặn việc mở rộng vỏ thiếu hoặc trống tham số. Trong trường hợp này, một bản mở rộng trống sẽ trở về mặc định khi sử dụng chương trình hiện tại đang hoạt động, đó là thường dùng, nhưng không phải lúc nào cũng giống như điều này, ví dụ như điều này, điều này có thể sẽ khác nếu tty của lệnh không phải là một rằng tmux đã bắt đầu, ví dụ vì sử dụng tập lệnh hoặc mong đợi , et cetera).


ngọt! điều đó hoàn toàn làm được ... rất nhiều đánh giá cao!
Brad

Cú pháp "$ {TMUX_Pane:?}" Không hoạt động trong vỏ cá
CodyChan

2

Bạn có thể nhận được tất cả các chỉ mục khung cũng như nhiều thông tin khác về các bảng với

tmux list-panes -a

Xem tmux(1)ĐỊNH DẠNG để có danh sách thông tin bạn có thể nhận và làm việc với.


1
cảm ơn về phản hồi - nhưng điều này không cho tôi biết đó là khung nào - chỉ là có các ô 0-3 trong một Cửa sổ, mà tôi đã có thể tìm ra. Tôi muốn có thể viết một tập lệnh bash được gọi là get_pane_numberthực sự trả về # đúng mà không có khung đang hoạt động.
Brad

2

Dựa trên hai giải pháp được đề xuất, tôi thấy chức năng này phù hợp với mình:

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

hoặc điều tương tự bắt đầu với index = 1

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

Nó không phải là đẹp nhất nhưng nó hoạt động và tôi có thể thả nó vào .bashrcvà chỉ cần sử dụng $Ibất cứ khi nào tôi cần

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.