Làm cách nào để biết tên phiên tmux hiện tại, bằng cách chạy lệnh tmux


34

Tôi đang viết kịch bản. Tôi thực sự muốn biết điều này. Tôi hy vọng tmux thực thi có thể cho tôi biết điều này.

Tôi tìm thấy

tmux rename <newname>

có thể đổi tên phiên hiện tại Nhưng tôi không thể tìm thấy một lệnh để lấy tên của chính nó.

Câu trả lời:


49

Với tmux 1.2 (và phiên bản mới hơn), bạn có thể sử dụng -ptùy chọn display-messagexuấ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-lefttùy chọn trong trang man).


+1, tốt hơn nhiều so với câu trả lời của tôi.
chepner

Tôi thực sự đánh giá cao việc bạn chỉ ra rằng nó yêu cầu tmux 1.2, đây chính xác là phiên bản có sẵn để cập nhật trực tuyến tự động openSUSE 11.3.
Jimm Chen

Với tmux 1.8, điều này trả về tên của phiên đính kèm ngay cả khi tôi không làm việc trong phiên đó.
Mihai Danila

Câu trả lời của Tim People dưới đây hoạt động với tmux 1.8 trở lên, cũng như giải quyết các điểm anh ấy nêu ra. Đó là câu trả lời tốt hơn.
Alexandros

8

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:

  1. phiên thiết bị đầu cuối hiện tại không phải là một phần của phiên tmux, hoặc
  2. có nhiều phiên tmux đính kèm

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.


1
Câu trả lời chính xác. Thay vì lặp qua từng tên phiên để liệt kê các bảng của nó, bạn cũng có thể sử dụng 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.
Brian Cline

Trở lại câu hỏi này sau khi sử dụng câu trả lời được chấp nhận và thất bại theo các vấn đề được mô tả ở đây. Xin hãy ủng hộ điều này. Nếu có thể, câu trả lời được chấp nhận nên được thay đổi.
Alexandros

1
Phương pháp 1 hoạt động tốt nếu kết hợp với kiểm tra TMUXbiế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.
ZeroPhase

8

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 -vkhô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/nullvà 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}'

1
Cải tiến là gì? Nếu đó là một điều cần thiết, bạn nên xem xét việc gửi nó dưới dạng chỉnh sửa thay vì trả lời. Để làm cho nó một câu trả lời tốt, có lẽ bạn nên xem xét bao gồm một số văn bản mô tả nhiều hơn.
Seth

1
@seth, tôi muốn bình luận nhưng kỳ lạ là không có đủ tín dụng để làm như vậy.
mặt sáng

Bạn cần 50 danh tiếng để bình luận . Thông thường không nên bình luận với mã phức tạp vì bạn thiếu ngắt dòng và cứ thế. Chỉnh sửa của bạn làm cho nó một câu trả lời khá tốt IMHO.
Seth

Ồ, tôi hiểu rồi Vấn đề "tty" là một điều bash. Tôi không sử dụng vỏ đồ chơi đó: D
Tim Peoples

1
@TimPeoples Trong khi nó có thể là một vấn đề Bash. Bash vẫn là tiêu chuẩn để mã các kịch bản shell đối với tính tương thích trên các thiết bị đầu cuối hiện đại. Chắc chắn, tiêu chuẩn posix là lý tưởng; nhưng, bash có một số tính năng tất cả các thiết bị đầu cuối tiên tiến hơn chia sẻ. Bằng cách nhấn Bash, hầu hết các thiết bị đầu cuối chính khác sẽ hoạt động. Tôi chỉ chạy shell check và bắt một loạt các lỗi xấu và các vấn đề định dạng. (chủ yếu sử dụng cú pháp cũ thay cho cú pháp mô tả hiện tại hơn)
ZeroPhase

4
  • Câu trả lời của Chris Johnsen trả về tên phiên ngay cả khi truy vấn từ bên ngoài.
  • câu trả lời sáng sủa của Tim và Tim Peoples a 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

3

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.

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.