bash 스크립트에서 tmux 세션에 있는지 어떻게 알 수 있습니까?


53

내를 유지하려면 bash_profileA의 자식 저장소 와 나는에 쉘 접근이 어떤 기계에 복제. 나는 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 스크립팅은 나의 장점이 아닙니다.)

답변:


72

Tmux는 TMUXtmux 세션에서 환경 변수를 설정하고로 설정 TERM합니다 screen. 100 % 신뢰할 수있는 지표는 아니지만 (예를 들어, screen내부 tmux또는 tmux내부에서 달리고 있는지 쉽게 알 수 없음 screen) 실제로는 충분해야합니다.

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것이 아닌 .bashrc와 .bash_profile의 차이점을~/.bash_profile 참조하십시오 . 모든 bash 인스턴스에서 실행되며 프롬프트 및 별명과 같은 쉘 사용자 정의를 포함합니다. 로그인 할 때 실행됩니다 (로그인 쉘이 bash 인 경우). 이상하게도 bash는 로그인 쉘에서 읽지 않으므로 다음 을 포함해야합니다.~/.bashrc~/.bash_profile~/.bashrc~/.bash_profile

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

대체 변수 TMUX_PANE도 있습니다. 레시피가 작동하지 않아서 만 눈치 d습니다. 나중에 나는 unset쉘 스크립트에서 변수를 부적절하게 사용했다는 것을 알았다 .profile.
0xC0000022L

[ "$TERM" = "screen" ]작동하지 않을 수 있습니다. 제 경우에는 화면이 screen-256컬러 로보고되었습니다 .
StevieD

@StevieD 나는 tmux가 스스로 이것을하지 않는다고 생각하지만 배포 패치 또는 구성 일 수 있습니다.
Gilles 'SO- 악마 중지'

2

다른 방법을 시도한 후에는 이것이 누군가를 도울 수 있도록 궁극적으로 나를 위해 일한 것입니다.

if [[ "$TERM" =~ "screen".* ]]; then
  echo "We are in TMUX!"
else
  echo "We are not in TMUX :/  Let's get in!"
  # Launches tmux in a session called 'base'.
  tmux attach -t base || tmux new -s base
fi

이 코드 스 니펫에서 TMUX 환경에 있지 않은지 확인하고 시작합니다. 이 코드 스 니펫을 .bashrc파일 에 넣으면 터미널을 열 때마다 TMUX가 자동으로 실행됩니다! 추신 : 우분투 쉘에서 테스트되었습니다.


1

이전 답변과 마찬가지로 ${TERM}변수를 테스트하면 코너 케이스가 생길 수 있고 tmux환경 변수를 자체 수명 내에 설정할 수 있습니다.

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

tmux환경 내부에 있는지 확인하려면 다음을 확인하십시오.

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

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