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).