Como saber se a sessão de terminal está sendo executada na tela

8

Ao executar um script bash, eu gostaria de saber se ele está sendo executado em um screen . Isso é possível?

Eu quero isso para que .bashrc possa definir a cor do prompt de comando dependendo se as sessões são iniciadas em uma tela ou não.

Descobri este link quando o meu foi respondido: Como posso dizer se estou em uma tela?

    
por DustByte 15.08.2013 / 17:14

3 respostas

8

Normalmente, $STY será definido.

Então:

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

$STY normalmente é o que você precisa para conversar com seu screen . Isso é usado para construir o caminho do soquete do domínio Unix usado para controlar screen (algo como /var/run/screen/S-$USER/$STY .

Agora, isso não funcionará, por exemplo, se a partir dessa tela você ssh for para outra máquina. O shell iniciado não terá $STY em seu ambiente, e isso não seria de nenhuma maneira útil, pois não seria capaz de acessar os soquetes de domínio Unix em sua máquina.

No entanto, é possível consultar o terminal com uma seqüência de escape para determinar seu tipo:

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

Outra abordagem, como sugerido por @val0x00ff, é verificar o valor da variável de ambiente $TERM . Esse valor serve para dizer aos aplicativos que tipo de terminal eles estão falando. Ele é definido por screen para algo que começa com screen (como screen pode implementar diferentes variantes de terminais). $TERM é passado em rlogin , rsh , telnet , ssh . Não é tão garantido que funcione como acima, mas é mais simples e menos intrusivo.

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

Como na solução anterior, você pode estar executando em screen , mas talvez não seja possível emitir comandos para ele com screen -X , por exemplo. No entanto, observe que você pode passar comandos usando seqüências de escape (embora não esteja habilitado por padrão por motivos de segurança).

    
por 15.08.2013 / 17:26
4

Ao executar na tela, sua variável de ambiente $TERM muda para a tela. Você pode verificar o script, por exemplo,

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

Essa seria uma das abordagens. echo $TERM fora da tela e novamente echo $TERM dentro da tela e veja a diferença

    
por 16.08.2013 / 10:51
1

Eu mesmo uso o tmux, e este pouco para listar sessões somente se eu ainda não estiver em uma sessão do 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
    
por 15.08.2013 / 17:28