tmux 세션의 이름을 어떻게 알 수 있습니까?


13

최근에을 사용하기 시작했습니다 tmux. 멋지지만이 응용 프로그램을 이해하는 데 여전히 문제가 있습니다. 내가 가진 기본 질문 중 하나는 다음과 같습니다. (명령 줄에서) tmux내가 로그인 한 세션 의 이름 을 어떻게 알 수 있습니까? tmux세션에 로그인하면 이름을 알려줍니다. 그러나 tmux세션에 로그인하지 않으면 아무 것도 또는 어떤 종류의 오류가 인쇄됩니다.

답변:


18

세션 이름은 변수에 저장되어 #S 에서 액세스 할 수 있습니다.

tmux display-message -p "#S"

에서 사용하고 싶다면 .tmux.conf간단 #S합니다. 이 -p옵션은 stdout에 메시지를 인쇄하고, 그렇지 않으면 메시지가 상태 행에 표시됩니다 .

세션 내에서 위의 명령을 호출하면 세션 이름이 반환됩니다. 세션 외부에서 호출 된 경우에도 여전히 마지막으로 실행중인 세션의 이름을 반환합니다. 세션 내부에 있는지 여부를 확인 하는 명령을 찾을 수 문제를 해결해야했습니다.

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

tmux list-sessions첨부 된 모든 세션을 표시 (attached)하고 끝에 표시됩니다. 를 사용하면 -n키워드를 찾는 곳을 제외하고 모든 출력 (option )을 억제합니다 (attached).이 줄에서 a 뒤에 모든 것을 잘라내어 :세션 이름을 남겨 둡니다. 이것은 반대로 세션 내외에서 나를 위해 작동합니다 tmux display-message -p "#S".

물론이 전혀 없다 경우에만 작동하지 :않고 (attached)세션의 이름으로.

Chris Johnsen이 언급 한 것처럼 세션 내부에 있는지 확인하는 방법 은 환경 변수가 설정되어 있는지 확인하는 것입니다.

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

1
그것이 옳아 보이더라도, 그것이 효과가 없다는 것을 인정해야합니다. 두 개의 콘솔이 있는데 하나는 tmux세션이 있고 다른 하나는 세션 외부에 tmux있습니다. 두 명령을 모두 입력 tmux display-message -p "#S"하면 동일한 결과가 인쇄되고 두 명령의 반환 값이 동일합니다.
e271p314

나는 같은 행동을 봅니다. 해결 방법에 대한 업데이트 된 답변을보십시오.
pfnuesel

4
TMUX 환경 변수를 확인하는 것만으로도 문제를 해결할 수 있습니다 (일반적으로 세션 내부의 프로세스에 대해 설정되고 세션 외부에 설정되지 않음). 이는 TMUX를 설정 또는 설정 해제하고 혼동을 줄 수 있으므로 "간단한 증거"가 아닙니다. 그러나 상당히 신뢰할 수 있어야합니다). 에서 KSH , 배쉬 , zsh을 , 등등 :[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
크리스 욘센

의견 주셔서 감사합니다. 그것은 실제로 더 우아하고 견고합니다. 답변에 귀하의 의견을 추가했습니다.
pfnuesel

이름이 다른 두 개의 tmux 세션에 동시에있는 경우 어떻게합니까? 이 작동합니까?
Mihai Danila

0

이 게시물을 사용하여 여기를 살펴보십시오 . tmux클라이언트 를 구별하는 것은 클라이언트 tty이지만 세션 이름은 tmux서버 속성이며 tmux클라이언트 내부 또는 외부에서 세션 이름을 볼 때와 동일 하다는 것을 이해했습니다 . 다음으로 tmux info | head클라이언트의 pid와 tty 및 서버의 pid를 표시하는을 사용할 수 있습니다 .

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

tmux클라이언트 내부에있는 경우 다음 명령 반환 값은 0이고 클라이언트 외부에 실행중인 경우 0이 아닙니다 tmux. 스크립트에서 실행하는 경우 tty가 실행중인 스크립트가 아닌 쉘 프로세스와 연관되므로 $$ 대신 ppid를 사용해야합니다.

tmuxTERM 환경 변수를 확인하는 것이 클라이언트 내부 또는 외부에 있는지 쉽게 알 수있는 쉬운 방법 중 하나 입니다. 클라이언트 외부에는 'xterm'이라고 표시되고 내부에는 'screen'이라고 표시됩니다. 그러나 첫 번째 방법이 훨씬 좋습니다.


0

다음은 펄 스크립트입니다. 그것을 쉘 스크립트 또는 쉘 스크립트 기능으로 만드는 것은 독자에게 맡겨진 연습입니다.

#!/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;
}

이는 TMUX 세션에서 다음 출력을 생성합니다.

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

TMUX 세션 외부에서 다음을 생성합니다.

<~> $ tmuxsessionname
Not in a TMUX session

print셸 스크립트 나 다른 방식으로 문을 사용 하려면 문을 버리고 종료 코드를 사용하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.