En règle générale, $STY
sera défini.
Donc:
if [ -n "$STY" ]; then
echo "I'm most likely running under screen"
fi
$STY
est 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 ssh
vers une autre machine. Le shell démarré là-bas n'aura pas $STY
dans 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 $TERM
variable d'environnement. Cette valeur est destinée à indiquer aux applications à quel type de terminal elles parlent. Il est défini par screen
quelque chose qui commence par screen
(comme screen
peut implémenter différentes variantes de terminaux). $TERM
est 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 -X
par 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é).
J'utilise tmux moi-même, et ce petit peu pour lister les sessions uniquement si je ne suis pas déjà dans une session tmux
la source