Câu trả lời:
Với tmux 1.2 (và phiên bản mới hơn), bạn có thể sử dụng -p
tùy chọn display-message
xuất thông báo ra thiết bị xuất chuẩn (thay vì hiển thị nó cho khách hàng đính kèm):
tmux display-message -p '#S'
#S
được định dạng như tên phiên (xem mô tả của status-left
tùy chọn trong trang man).
Tôi ngạc nhiên rằng, sau gần 5 năm, không ai chỉ ra rằng cả hai câu trả lời này đều không đầy đủ. Mặc dù cả hai đều hoạt động tốt miễn là TTY hiện tại được gắn vào phiên tmux duy nhất trên máy chủ, các câu trả lời này đều thất bại nếu:
Trong trường hợp trước, cả hai câu trả lời ở đây đều báo cáo lại tên của phiên đính kèm (bất kể tty hiện tại có bị chi phối bởi phiên đó hay không). Trong trường hợp sau, kết quả có thể không xác định hoặc sẽ dẫn đến nhiều câu trả lời.
Câu hỏi thích hợp phải là "Tên của phiên tmux mà phiên thiết bị đầu cuối hiện tại của tôi được đính kèm là gì?"
Đối với anh ta trả lời cho câu hỏi đó , thực hiện:
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}'
Điều này hoạt động bất kể số phiên tmux (đính kèm hay nói cách khác) và bất kể phiên thiết bị đầu cuối hiện tại là hay không phải là một phần của phiên tmux.
tmux list-panes -a -F '#{pane_tty} #{session_name}'
để liệt kê các bảng của mỗi phiên. Không chắc làm thế nào mới -a
, vì vậy YMMV.
TMUX
biến môi trường trước khi chạy tmux display-message -p '#S'
cho thiết lập máy tính để bàn thông thường.
Câu trả lời mở rộng / sửa chữa của người
theo thời gian theo nhận xét của don_crissti
về lý do tại sao điều này grep -v
không hoạt động như mong đợi? .
Lệnh "$ (tty)" trong câu trả lời của người thời gian
| grep "$ (tty)" |
sẽ không làm việc trong bối cảnh đó như mong đợi. Nó đánh giá một chuỗi 'không phải là một tty'.
Thay thế nó bằng một biến giải quyết vấn đề này.
tty = $ (tty)
...
| grep "$ tty" |
Ngoài ra, khi không có phiên tmux nào tồn tại, mã gốc sẽ tạo ra
Thông báo lỗi "không có máy chủ nào chạy trên / tmp / tmux-1000 / default" .
Thêm 2>/dev/null
và mã sẽ chạy mà không in ra thông báo lỗi.
Mã sửa đổi đọc là:
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}'
tty
.Thay vào đó, tôi thấy điều này hoạt động chính xác với tôi:
if [[ -n "$TMUX_PANE" ]]; then
session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi
Không lý tưởng, nhưng bạn có thể trích xuất tên của phiên đính kèm với awk
:
tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'
Định dạng tùy chỉnh dễ phân tích hơn một chút so với mặc định.