En règle générale, $STYsera défini.
Donc:
if [ -n "$STY" ]; then
echo "I'm most likely running under screen"
fi
$STYest généralement ce dont vous avez besoin pour parler à votre screen. Ceci est utilisé pour construire le chemin du socket de domaine Unix utilisé pour contrôler screen(quelque chose comme /var/run/screen/S-$USER/$STY.
Maintenant, cela ne fonctionnera pas, par exemple, si à partir de cet écran, vous sshvers une autre machine. Le shell démarré là-bas n'aura pas $STYdans son environnement, et cela ne lui serait d'aucune utilité de toute façon, car il ne pourrait pas accéder aux sockets de domaine Unix sur votre machine.
Cependant, il est possible d'interroger le terminal avec une séquence d'échappement pour déterminer son type:
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
Une autre approche, comme suggéré par @ val0x00ff, consiste à vérifier la valeur de la $TERMvariable d'environnement. Cette valeur est destinée à indiquer aux applications à quel type de terminal elles parlent. Il est défini par screenquelque chose qui commence par screen(comme screenpeut implémenter différentes variantes de terminaux). $TERMest passé accross rlogin, rsh, telnet, ssh. Il n'est pas garanti de fonctionner comme ci-dessus, mais il est plus simple et moins intrusif.
case $TERM in
(screen*) echo "I'm more than likely running in screen"
esac
Comme pour la solution précédente, vous pouvez être en cours d'exécution screen, mais vous ne pourrez peut-être pas lui envoyer de commandes screen -Xpar exemple. Notez cependant que vous pouvez passer des commandes à l'aide de séquences d'échappement (bien qu'il ne soit pas activé par défaut pour des raisons de sécurité).