tmux 명령을 실행하여 현재 tmux 세션 이름을 어떻게 알 수 있습니까?


34

스크립트를 작성하고 있습니다. 나는 정말로 이것을 알고 싶다. 나는 tmux 실행 파일이 이것을 말해 줄 수 있기를 바랍니다.

나는 찾는다

tmux rename <newname>

현재 세션의 이름을 바꿀 수 있습니다. 그러나 자체 이름을 가져 오는 명령을 찾을 수 없습니다.

답변:


49

함께 TMUX (나중에) 1.2, 당신은 사용할 수 -p의 옵션을 display-message(대신 연결된 클라이언트에 표시) stdout으로 출력에 메시지를 :

tmux display-message -p '#S'

#S세션 이름으로 형식이 지정됩니다 (설명서 페이지의 status-left옵션 설명 참조).


+1, 내 대답보다 훨씬 낫습니다.
chepner

OpenSUSE 11.3 자동 온라인 업데이트에 사용할 수있는 버전 인 tmux 1.2가 필요하다는 점을 지적합니다.
Jimm Chen 1

tmux 1.8을 사용하면 해당 세션에서 작업하지 않아도 연결된 세션의 이름을 반환합니다.
Mihai Danila

아래의 Tim People의 답변은 tmux 1.8 이상에서 작동하며 그가 올린 점을 해결합니다. 그게 더 좋은 대답입니다.
Alexandros

8

거의 5 년이 지난 후에도이 답변들 중 어느 것도 적절하지 않다고 지적한 사람이 아무도 없습니다. 현재 TTY가 호스트의 유일한 tmux 세션에 연결되어있는 한 두 가지 모두 제대로 작동하지만 다음과 같은 경우이 두 가지 대답이 동일합니다.

  1. 현재 터미널 세션이 tmux 세션의 일부가 아니거나
  2. 여러 개의 연결된 tmux 세션이 있습니다

전자의 경우 여기에있는 두 답변 모두 현재 세션이 해당 세션에 의해 관리되는지 여부에 관계없이 연결된 세션의 이름을 다시보고합니다. 후자의 경우 결과가 불확실하거나 여러 답변이 될 수 있습니다.

올바른 질문은 "현재 터미널 세션이 연결된 tmux 세션의 이름은 무엇입니까?"

그가 질문에 대답하려면 다음 실행하십시오.

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}'

이것은 tmux 세션 수 (첨부 또는 기타)와 상관없이 현재 터미널 세션이 tmux 세션의 일부인지 여부에 관계없이 작동합니다.


1
좋은 대답입니다. 각 세션 이름을 반복하여 창 tmux list-panes -a -F '#{pane_tty} #{session_name}'을 나열하는 대신 모든 세션 창을 나열 하는 데 사용할 수도 있습니다 . 새로운 -a것이 확실하지 않으므로 YMMV.
브라이언 클라인

수락 된 답변을 사용하고 여기에 설명 된 문제에 따라 실패한 후이 질문으로 돌아 왔습니다. 이것을 찬성하십시오. 가능하면 허용 된 답변을 변경해야합니다.
Alexandros

1
방법 1은 일반적인 데스크톱 설정 TMUX을 실행하기 전에 환경 변수 를 확인하는 것과 함께 사용할 경우 제대로 작동합니다 tmux display-message -p '#S'.
ZeroPhase

8

왜 이것이 예상대로 작동하지 않는지 에 대한 don_crissti의 의견 에 따라 확장되거나 수정 된 사람들의 대답무엇 입니까? .grep -v

tim-peoples의 답변 에서 "$ (tty)"명령

| grep "$ (tty)"|

해당 컨텍스트에서 예상대로 작동하지 않습니다. 'tty가 아닌'문자열로 평가됩니다.

변수로 바꾸면이 문제가 해결됩니다.

tty = $ (tty)

...

| grep "$ tty"|

또한 tmux 세션이 존재하지 않으면 원래 코드는

"/ tmp / tmux-1000 / default에서 서버가 실행되고 있지 않습니다" 오류 메시지.

추가 2>/dev/null하면 코드가 오류 메시지를 인쇄하지 않고 실행됩니다.

수정 된 코드는 다음과 같습니다.

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
개선점은 무엇입니까? 필요한 경우 답변이 아닌 수정 사항으로 제출하는 것이 좋습니다. 좋은 답변을 얻으려면 좀 더 설명적인 텍스트를 포함시키는 것이 좋습니다.
세스

1
@ seth, 나는 의견을 말하고 싶었지만 이상하게도 신용이 충분하지 않았습니다.
밝은면

댓글을 달려면 50 개의 평판 이 필요합니다 . 줄 바꿈 등이 없기 때문에 복잡한 코드로 주석 처리하는 것은 일반적으로 좋지 않습니다. 귀하의 편집으로 IMHO에 대한 좋은 답변이되었습니다.
세스

아, 이제 알겠다 "tty"문제는 bash입니다. 나는 그 장난감 껍질을 사용하지 않습니다 : D
Tim Peoples

1
@TimPeoples Bash 문제 일 수 있습니다. Bash는 여전히 현대 터미널에서의 호환성을 위해 쉘 스크립트를 코딩하는 표준입니다. 물론 posix 표준이 이상적입니다. 그러나 bash에는 모든 고급 터미널이 공유하는 기능이 있습니다. 배쉬를 치면 다른 주요 터미널 대부분이 제대로 작동합니다. 방금 셸 검사를 실행하고 많은 잘못된 오류 및 서식 문제를 발견했습니다. (대부분 현재 설명적인 구문 대신 기존 구문 사용)
ZeroPhase

4
  • Chris Johnsen의 답변은 외부에서 쿼리 할 때도 세션 이름을 반환합니다.
  • 밝은 쪽과 Tim Peoples의 대답은을 가정합니다 tty.

대신, 나는 이것이 나를 위해 정확하게 작동한다는 것을 알았습니다.

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi

3

이상적이지는 않지만 다음을 사용하여 첨부 된 세션의 이름을 추출 할 수 있습니다 awk.

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

사용자 정의 형식은 기본값보다 구문 분석이 조금 더 쉽습니다.

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