내부 tmux 세션의 창 번호를 가져옵니다.

내부 tmux 세션의 창 번호를 가져옵니다.

외부 세션에서는 pane_cur="$(tmux display-message -p '#{pane_id}' | cut -c 2 | bc)"내부 세션의 창을 사용하여 창 전환 동작을 제어합니다. 현재는 내부 세션이 아닌 외부 세션의 포드 ID만 가져오고 있습니다.

외부 창 ID를 기반으로 중첩된 세션을 드릴다운하고 창 ID가 있는 경우 이를 가져오려면 어떻게 해야 합니까?

답변1

예비 설명

이 답변에서는 모든 tmux 세션이 단일 tmux 서버 내에 존재한다고 가정합니다. 외부 및 내부 세션이 서로 다른 tmux 서버(동일하거나 다른 시스템에서 실행)에 속하는 경우 상황은 훨씬 더 복잡하며 이 답변은 적용되지 않습니다.


분석하다

하나의 tmux 세션(예: 외부 세션)에서 다른 tmux 세션(예: 내부 세션)에서 일부 정보를 얻으려면 다른 세션을 대상으로 해야 합니다. 많은 tmux 명령( tmux 포함 display-message) 에서 -t대상을 사용하고 지정할 수 있습니다.

내부 세션이 다음 명령이라는 것을 알고 있는 경우 1:

tmux display-message -t 1: -p '#{pane_id}'

세션 내 현재 창에서 현재 활성화된 창의 ID를 제공합니다.

어떤 번호(또는 세션 이름)를 사용해야 할지 모르는 경우 tmux에 문의해야 합니다. 이것이 "드릴다운"이라는 의미인 것 같습니다.


프로그램

다음을 수행할 수 있습니다.

  1. tmux display-message -p '#{pane_id}'당신에게 주어진 것으로 가정합니다 %5. 외부 세션의 활성 창입니다.

  2. 실제로 창의 ID는 필요하지 않습니다. Pod의 프로세스에 대한 tty tmux를 생성해야 합니다. 예를 들어 it을 사용하여 tmux display-message -p '#{pane_tty}'얻을 수 있습니다 /dev/pts/2.

  3. 이 창의 내부 세션에 tmux 클라이언트가 연결되어 있다고 가정하면 tty를 사용하여 클라이언트 세션을 찾아야 합니다. 이라고 불리는 tmux list-clients -F '#{client_tty} #{client_session}'출력은 다음과 같습니다.

    /dev/pts/1 foo
    /dev/pts/2 1
    

    /dev/pts/2이제 어떤 세션을 사용해야 하는지 알았습니다 1.

  4. 이 세션의 활성 창을 식별합니다.

    tmux display-message -t 1: -p '#{pane_id}'
    
  5. 더 깊이 드릴링하려면(다른 중첩 세션이 있기 때문에) (2)로 이동하세요. 하지만 이번에는 방금 연구한 창을 대상으로 해야 합니다.


예제 쉘 코드

#!/bin/sh

pane="$(tmux display-message -p '#{pane_id}')" || exit 1

while
   tty="$(tmux display-message -t "$pane" -p '#{pane_tty}')"
   session="$(
      tmux list-clients -F '#{client_tty} #{client_session}' \
      | grep "^$tty " | head -n 1 | cut -d ' ' -f 2-
   )"
   [ -n "$session" ]
do
   pane="$(tmux display-message -t "$session:" -p '#{pane_id}')"
done

printf '%s\n' "$pane"

코드는 모든 오류를 처리하려고 시도하지 않습니다. 특히 코드 런타임 창이나 세션이 삭제되면 $session한 호출의 정보(예:)가 tmux다음 호출에 사용될 때 유효하지 않을 수 있습니다 tmux.

코드를 로 저장하고 scrpt, 실행 가능하게 만들고, watch ./scrpt가장 바깥쪽 tmux 세션의 셸에서 실행하여 테스트했습니다. 내 테스트에서는 최대 3개의 추가 수준의 중첩된 tmux를 만들었지만 코드는 모든 깊이를 처리하도록 설계되었습니다.


사이드 노트

printf '%s\n' "${pane#%}"%그것이 당신이 원하는 것이라면, 앞부분 없이 숫자를 줄 것입니다. 하지만 tmux에서는 pane_id이것이 유일한 조합 표현 %이지 pane_index유일한 조합 표현이 아니라는 점을 기억하세요 %. 반환 %에서 해당 숫자를 제거하고 나중에 tmux에서 사용 하면 pane_id(다시 추가하지 않고 %) 로 해석될 수 있습니다 pane_index.

관련 정보