화면 내에서 터미널 세션이 실행 중인지 확인하는 방법

화면 내에서 터미널 세션이 실행 중인지 확인하는 방법

bash 스크립트를 실행할 때 이것이 가능한지 확인하고 싶습니다 screen.

.bashrc세션이 화면 내에서 시작되는지 여부에 따라 명령 프롬프트의 색상을 설정할 수 있기 를 원합니다 .

답변을 받은 후 다음 링크를 찾았습니다.내가 화면에 있는지 어떻게 알 수 있나요?

답변1

일반적으로 $STY설정됩니다.

그래서:

if [ -n "$STY" ]; then
  echo "I'm most likely running under screen"
fi

$STY보통 대화를 나누기 위해 필요한 것 screen. 제어에 사용되는 Unix 도메인 소켓에 대한 경로를 구성하는 데 사용됩니다 screen( /var/run/screen/S-$USER/$STY.

ssh예를 들어 이 화면에서 다른 컴퓨터에 연결하면 작동하지 않습니다. 여기서 실행된 셸은 $STY해당 환경에 하나도 없으며 컴퓨터의 Unix 도메인 소켓에 액세스할 수 없기 때문에 어쨌든 아무 소용이 없습니다.

그러나 터미널은 이스케이프 시퀀스를 사용하여 해당 유형을 결정하도록 쿼리할 수 있습니다.

if [ -t 1 ] && [ -t 0 ]; then
  s=$(stty -g)
  stty -icanon -echo min 0 time 3
  printf '\033[>c'
  type=$(dd count=1 2> /dev/null)
  stty "$s"
  case $type in
    (*'>83;'*) echo "this is screen"
  esac
fi

@val0x00ff가 제안한 또 다른 접근 방식은 환경 변수의 값을 확인하는 것입니다 $TERM. 이 값은 애플리케이션이 어떤 유형의 터미널과 통신하고 있는지 알려주기 위한 것입니다. ( 다양한 터미널 변형이 ​​구현될 수 있음) screen로 시작하는 것으로 설정됩니다 . 지나가 다 , , . 위와 같이 작동한다고 보장할 수는 없지만 더 간단하고 방해가 적습니다.screenscreen$TERMrloginrshtelnetssh

case $TERM in
  (screen*) echo "I'm more than likely running in screen"
esac

이전 솔루션과 마찬가지로 실행 중일 수도 있지만 screen명령을 실행하지 못할 수도 있습니다 screen -X. 그러나 이스케이프 시퀀스를 사용하여 명령을 전달할 수 있습니다(보안상의 이유로 기본적으로 활성화되어 있지는 않지만).

답변2

화면에서 실행하면 $TERM환경 변수가 화면으로 변경됩니다. 다음과 같은 스크립트를 확인할 수 있습니다.

if [[ "$TERM" == screen* ]]; then
  echo "Running in screen"
else 
  echo "Outside screen"
fi 

방법 중 하나일 것입니다. echo $TERM화면 밖과 echo $TERM화면에서 차이점을 다시 살펴보세요.

답변3

나는 tmux를 직접 사용하고 있으며 세션은 아직 tmux 세션에 있지 않은 경우에만 나열됩니다.

if [ -z "$TMUX" ]; then
    alias tmuxa='tmux attach -d -t'
    alias tmuxc='tmux new-session -s'
    echo "You're not in a tmux session, create a new one with tmuxc, or attach to one of the ones below with tmuxa"
    tmux ls
fi

관련 정보