Làm thế nào để tôi biết tên của một phiên tmux?


13

Gần đây, tôi bắt đầu sử dụng tmux. Tôi thấy nó hay, nhưng tôi vẫn gặp vấn đề khi hiểu ứng dụng này. Một trong những câu hỏi cơ bản tôi có là: Làm thế nào để tôi biết (từ dòng lệnh) tên của tmuxphiên tôi đã đăng nhập là gì? Nếu tôi đăng nhập vào một số tmuxphiên, nó sẽ cho tôi biết tên của nó. Nhưng nếu tôi không đăng nhập vào một tmuxphiên, nó sẽ in không có gì hoặc một loại lỗi nào đó.

Câu trả lời:


17

Tên của phiên được lưu trữ trong biến #S , để truy cập nó trong một , bạn có thể làm

tmux display-message -p "#S"

Nếu bạn muốn sử dụng nó .tmux.conf, nó chỉ đơn giản #S. Lưu ý rằng -ptùy chọn sẽ in thông báo trên thiết bị xuất chuẩn, nếu không, thông báo sẽ được hiển thị trong dòng trạng thái .

Nếu lệnh trên được gọi bên trong một phiên, nó sẽ trả về tên của phiên. Nếu nó được gọi bên ngoài bất kỳ phiên nào, nó vẫn trả về tên của phiên vẫn đang chạy cuối cùng. Tôi không thể tìm thấy lệnh để kiểm tra, nếu một trong số đó có trong phiên hay không, vì vậy tôi đã phải đưa ra công việc này xung quanh:

tmux list-sessions | sed -n '/(attached)/s/:.*//p'

tmux list-sessionshiển thị tất cả các phiên, nếu một phiên được đính kèm, nó sẽ hiển thị (attached)ở cuối. Với chúng tôi loại bỏ tất cả đầu ra (tùy chọn -n) ngoại trừ nơi chúng tôi tìm thấy từ khóa (attached), tại dòng này, chúng tôi sẽ cắt bỏ mọi thứ sau một :, để lại cho chúng tôi tên của phiên. Điều này làm việc cho tôi trong và ngoài một phiên, trái ngược với tmux display-message -p "#S".

Tất nhiên điều này chỉ hoạt động nếu không có :và không có (attached)trong tên của phiên.

Như nhận xét của Chris Johnsen , một cách để kiểm tra xem một người có ở trong phiên là xem biến môi trường của nó có được đặt không:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"

1
Ngay cả nó có vẻ đúng, tôi phải thừa nhận nó không hoạt động với tôi. Tôi có hai bảng điều khiển, trong một bản tôi có tmuxphiên và bản còn lại tôi ngoài tmuxphiên. Khi tôi gõ vào cả hai lệnh đó tmux display-message -p "#S", cùng một kết quả được in và giá trị trả về của cả hai lệnh là như nhau.
e271p314

Tôi thấy hành vi tương tự. Nhìn vào câu trả lời cập nhật của tôi cho một công việc xung quanh.
pfnuesel

4
Có lẽ bạn chỉ có thể thoát khỏi việc kiểm tra biến môi trường TMUX (nó thường được đặt cho các quy trình bên trong một phiên và không được đặt bên ngoài phiên. Đây không phải là một trò lừa bằng chứng, vì một cái gì đó có thể đặt hoặc hủy đặt TMUX và gây nhầm lẫn cho mọi thứ, nhưng nó phải khá đáng tin cậy). Trong ksh , bash , zsh , et cetera:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen

Cảm ơn các bình luận. Đó thực sự là một cách thanh lịch và đủ mạnh mẽ, tôi nghĩ. Tôi đã thêm nhận xét của bạn trong câu trả lời của tôi.
pfnuesel

Điều gì xảy ra nếu tôi ở trong hai phiên tmux với các tên khác nhau cùng một lúc? Nó có hoạt động không?
Mihai Danila

0

Có một cái nhìn ở đây , sử dụng bài đăng này tôi hiểu rằng một điều phân biệt các tmuxmáy khách là tên ttynhưng phiên của chúng là thuộc tính tmuxmáy chủ và giống nhau khi chúng ta nhìn vào tên phiên từ bên trong hoặc bên ngoài tmuxmáy khách. Tiếp theo, chúng tôi có thể sử dụng tmux info | headmàn hình hiển thị pid và tty của máy khách và pid của máy chủ.

tmux info | grep $$ | grep -q `ps -p $$ -o tty=`

Giá trị trả về lệnh sau là 0 nếu chúng ta ở trong tmuxmáy khách hoặc khác 0 nếu chúng ta đang chạy bên ngoàitmux máy khách. Nếu bạn đang chạy nó từ một tập lệnh, hãy đảm bảo bạn sử dụng ppid thay vì $$ vì tty được liên kết với quy trình shell chứ không phải tập lệnh bạn đang chạy.

Một cách dễ dàng nhưng ít mạnh mẽ hơn để biết chúng ta ở bên trong hay bên ngoài tmuxmáy khách là bằng cách xem biến môi trường TERM. Có vẻ như bên ngoài máy khách có ghi 'xterm' nhưng bên trong nó có chữ 'màn hình'. Tuy nhiên, tôi thấy cách đầu tiên tốt hơn nhiều.


0

Đây là một kịch bản perl; làm cho nó trở thành một kịch bản shell hoặc chức năng shell script là một bài tập để lại cho người đọc.

#!/opt/local/bin/perl

use strict;
use warnings;

if (exists $ENV{'TMUX'}) {
    # session ID is the last element
    # /tmp/1s/ffkjhk76sdgn/T/tmux-771/default,16772,8
    my($id) = $ENV{'TMUX'};
    $id =~ s{^.*,(\d+)$}{$1};

    # get session name
    my($cmd) = q(tmux ls -F "#{session_name}: #{session_id}");
    open(IN, "$cmd |") || die qq([ERROR] Cannot open pipe from "$cmd" - $!\n);

    while (<IN>) {
        chomp;

        if (m{(^.*):\s+\$$id$}) {
            print "Session name: <$1>\n";
            exit 0;
        }
    }

    print "Unable to determine TMUX session name\n";
    exit 1;
}
else {
    print "Not in a TMUX session\n";

    exit 1;
}

Điều này tạo ra đầu ra sau trong phiên TMUX:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

Ngoài phiên TMUX, nó sẽ tạo ra các mục sau:

<~> $ tmuxsessionname
Not in a TMUX session

Bạn có thể bỏ các printcâu lệnh và chỉ sử dụng mã thoát nếu bạn muốn sử dụng đoạn mã này trong tập lệnh shell hoặc thứ gì đó.

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.