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

9

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

Eu quero isso para que .bashrcpossa 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 saber se estou em uma tela?

DustByte
fonte

Respostas:

10

Normalmente, $STYserá definido.

Assim:

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

$STYnormalmente é o que você precisa conversar com o 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ê for sshpara outra máquina. O shell iniciado por lá não terá $STYem seu ambiente, e isso não seria de nenhuma utilidade para ele, 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 sequência de escape para determinar seu tipo:

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

Outra abordagem, conforme sugerido por @ val0x00ff, é verificar o valor da $TERMvariável de ambiente. Esse valor tem como objetivo informar aos aplicativos com que tipo de terminal eles estão falando. É definido screencomo algo que começa com screen(como screenpode implementar diferentes variantes de terminais). $TERMé passado transversalmente rlogin, rsh, telnet, ssh. Não é tão garantido que funcione como o descrito acima, mas é mais simples e menos invasivo.

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

Como na solução anterior, você pode estar executando screen, mas pode não ser capaz de emitir comandos para ela, screen -Xpor exemplo. No entanto, observe que você pode passar comandos usando seqüências de escape (embora não esteja ativado por padrão por razões de segurança).

Stéphane Chazelas
fonte
4

Ao executar na tela, sua $TERMvariável de ambiente muda para 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 $TERMfora da tela e novamente echo $TERMdentro da tela e veja a diferença

Valentin Bajrami
fonte
Meu $ TERM está definido como "xterm". Então, isso não funcionaria no meu caso.
aakoch 31/01
1

Eu mesmo uso o tmux, e este pouco para listar sessões apenas se 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
Rqomey
fonte