bash 스크립트를 통해 tmux 세션에 있는지 어떻게 알 수 있나요?

bash 스크립트를 통해 tmux 세션에 있는지 어떻게 알 수 있나요?

bash_profile나는 내 것을 넣는 걸 좋아해요Git 저장소셸을 통해 액세스할 수 있는 모든 컴퓨터에 복제합니다. tmux대부분의 경우 user@host쉘 프롬프트의 전통적인 위치 대신 상태 줄에 문자열을 표시하기 때문입니다 .

그러나 내가 사용하는 모든 사이트에 이 tmux프로그램이 설치되어 있는 것은 아니며 항상 사용하지 않을 수도 있습니다. tmux세션에 참여하지 않는 시간을 감지하고 이에 따라 프롬프트를 조정하고 싶습니다 . 지금까지 내 반쯤 구운 솔루션은 .bash_profile다음과 같습니다.

_display_host_unless_in_tmux_session() {
    # ???
}
export PROMPT_COMMAND='PS1=$(_display_host_unless_in_tmux_session)${REST_OF_PROMPT}'

(매번 확인하는 것이 최선의 접근 방식은 아닐 수 있으므로 더 나은 방법에 대한 제안을 환영합니다. Bash 스크립팅은 저의 강점이 아닙니다.)

답변1

TMUXtmux는 tmux 세션 내에서 환경 변수를 설정하고 TERM로 설정됩니다. 이는 100% 신뢰할 수 있는 지표는 아니지만(예: 내부에서 실행 중인지 외부에서 실행 중인지 screen쉽게 알 수 없음 ) 실제로는 충분할 것입니다.screentmuxtmuxscreen

if ! { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } then
  PS1="@$HOSTNAME $PS1"
fi

이것을 복잡한 프롬프트 설정에 통합해야 하는 경우 PROMPT_COMMAND(그런데 이것은 bash 설정이므로 내보내면 안 됩니다):

if [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; then
  PS1_HOSTNAME=
else
  PS1_HOSTNAME="@$HOSTNAME"
fi
PROMPT_COMMAND='PS1="$PS1_HOSTNAME…"'

tmux가 설치되어 있는지 테스트해야 하는 경우:

if type tmux >/dev/null 2>/dev/null; then
  # you can start tmux if you want
fi

그건 그렇고, 이 모든 것이 ~/.bashrc대신 들어가야 합니다 ~/.bash_profile(참조.bashrc와 .bash_profile의 차이점). ~/.bashrc각 bash 인스턴스에서 실행되며 프롬프트 및 별칭과 같은 셸 사용자 정의가 포함됩니다. ~/.bash_profile로그인할 때 실행합니다(로그인 쉘이 bash인 경우). 이상하게도 bash는 ~/.bashrc로그인 쉘을 읽지 않으므로 다음 ~/.bash_profile을 포함해야 합니다 .

case $- in *i*) . ~/.bashrc;; esac

답변2

이전 답변과 마찬가지로 변수를 테스트하면 환경 변수가 자체 수명 내에 설정되는 ${TERM}극단적인 경우가 발생할 수 있습니다 .tmux

$ env|grep -i tmux
TMUX=/tmp/tmux-1000/default,4199,5
TMUX_PANE=%9
TMUX_PLUGIN_MANAGER_PATH=/home/imil/.tmux/plugins/

특정 환경에 있는지 확인하려면 tmux다음을 확인하세요.

$ [ -z "${TMUX}" ] && echo "not in tmux"

답변3

tmux3.2 이상을 실행 중이 거나OpenBSD 6.8 이상또는 tmux소스에서 빌드2020년 5월 16일 업데이트됨TERM_PROGRAM), 환경 변수를 사용할 수 있습니다 .

if [ "$TERM_PROGRAM" = tmux ]; then
  echo 'In tmux'
else
  echo 'Not in tmux'
fi

이전 버전에는 tmux이 환경 변수가 없습니다.

답변4

때로는 액세스 권한이 없을 수도 $TMUX있고 $TERM확실히 신뢰할 수 없는 경우도 있습니다. 그런 다음 창 ID(자체에서 얻은 ID tmux와 다음에서 얻을 수 있는 ID)를 비교할 수 있습니다 xdotool.

if [ $(tmux showenv | awk -v FS='=' '/WINDOWID/{print $2}') \
     -eq \
     $(xdotool getactivewindow) ]
then
    echo "This terminal is running tmux!"
fi

관련 정보