Normalmente, $STY
será definido.
Assim:
if [ -n "$STY" ]; then
echo "I'm most likely running under screen"
fi
$STY
normalmente é 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 ssh
para outra máquina. O shell iniciado por lá não terá $STY
em 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 $TERM
variável de ambiente. Esse valor tem como objetivo informar aos aplicativos com que tipo de terminal eles estão falando. É definido screen
como algo que começa com screen
(como screen
pode 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 -X
por 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).
Eu mesmo uso o tmux, e este pouco para listar sessões apenas se ainda não estiver em uma sessão do tmux
fonte