Comment puis-je savoir si je suis dans un écran?

En utilisant l’écran sous Linux, comment puis-je savoir si je suis dans un écran ou non? Je pourrais exit et je quitterais un écran si j’étais dans un, mais si je ne l’étais pas, alors je finirais par fermer mon terminal.

En faisant screen -r , je pouvais voir si d’autres écrans étaient connectés, mais comment savoir si mon terminal actuel est l’un de ces écrans?

Cochez $STY . Si c’est nul, vous êtes sur un “vrai” terminal. S’il contient quelque chose, c’est le nom de l’écran dans lequel vous vous trouvez.

Si vous n’êtes pas à l’écran:

 eric@dev ~ $ echo $STY eric@dev ~ $ 

Si vous êtes à l’écran:

 eric@dev ~ $ echo $STY 2026.pts-0.ip-10-0-1-71 

Une autre façon de faire est de faire écho à $ TERM. Comme je finis par le faire beaucoup, j’ai ajouté un alias dans mon fichier .bashrc:

 alias trm='echo $TERM' 

De cette façon, que ce soit à l’écran ou non, si je viens juste d’exécuter ‘trm’, cela me montrera si je suis en mode ECRAN ou ailleurs (généralement XTERM).

Approche alternative pour vérifier si vous êtes à l’écran.

type:

 Ctrl-a ? 

Si vous voyez l’écran vous aider, vous êtes à l’écran.

Sinon, vous aurez un point d’interrogation “?” à l’invite

Entrez simplement echo $STY ; Cela retournera l’écran attaché avec l’identifiant du processus, par exemple

 $ echo $STY 34046.myScreen 

Comme toutes les autres méthodes reposent sur des variables d’environnement (qui peuvent simplement être remplacées) ou sur le caractère de commande de screen (qui peut également être remplacé), le moyen le plus sûr de vérifier serait de lister tous les ancêtres du processus en cours.

 pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | grep screen | wc -l 

Si elle imprime 1, alors le processus que vous exécutez a un ancêtre avec le mot «screen» dans le nom de l’exécutable, sinon il n’y en a pas.

Une inspection visible plus facile pourrait être obtenue de:

 pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | less 

Bien que ssh se soit connecté à un système distant (plus ancien), j’ai remarqué que $ TERM indiquait que j’utilisais ‘screen-256color’, mais il n’y avait pas d’entrée termcap / terminfo pour cela, j’ai donc été obligé de empêcher le terminal de produire des déchets occasionnels:

 case $TERM in (screen-256color) export TERM='screen' esac 

pour l’utiliser à la place.

TL; DR, $ TERM indiquera généralement si vous êtes dans une session d’écran à distance. Vous pouvez utiliser la case $TERM in (screen*) echo "you are in a screen session"; esac case $TERM in (screen*) echo "you are in a screen session"; esac si vous voulez juste un indice visuel et n’avez pas besoin de faire quelque chose de spécifique

Ajoutez un ou plusieurs des éléments suivants dans votre .bashrc

  • alias mysession='echo ${STY}'
  • alias myterm='echo ${TERM}'
  • alias isscreen='if test -n "$STY"; then echo " screen session: ${STY}"; else echo " NOT a screen session"; fi'

Ensuite, vous pouvez savoir si vous êtes dans un screen en tapant des commandes simples.

Le problème avec la plupart des réponses ci-dessus est que nous pourrions être dans une souscouche d’une session d’écran attachée. Ou nous pourrions ouvrir un shell à un hôte distant à partir d’une session d’écran. Dans le premier cas, nous pouvons parcourir la parenté de l’arborescence des processus et rechercher le nom du programme d’ screen . Dans ce dernier cas, la plupart du temps, nous pouvons vérifier la variable TERM pour quelque chose comme screen* .

Ma réponse est similaire à / u / Parthian-Shot mais pas tellement dépendante de l’utilitaire pstree; les options qu’il utilise ne sont pas disponibles pour moi. D’autre part, mon implémentation dépend toujours de Linux: pour les systèmes non-Linux, il faut modifier la commande ps ; Pour les systèmes avec des shells plus anciennes qui ne prennent pas en charge les baies, vous aurez encore plus de solutions. Mais peu importe:

 ps_walk_parents() { local tmp local ppid=$PPID while [[ $ppid != 1 ]]; do tmp=($( ps -o ppid,comm -p $ppid )) ppid=${tmp[0]} # grab parent pid echo ${tmp[1]} # output corresponding command name done } if [[ "$TERM" =~ screen* ]] || ps_walk_parents |grep -qxi screen ; then # we are in a screen terminal fi 

Nous pourrions optimiser notre fonction un peu pour ne plus chercher si / quand un parent de processus correspond au nom de la commande cible (“screen”), mais en général, la fonction n’atteindra que 2 à 3 itérations. Vous voulez probablement mettre ce code dans une initialisation de démarrage telle que .bashrc ou .profile ou quelque chose, donc encore une fois, ne vaut pas la peine d’être optimisé.

Ma solution au problème est beaucoup plus simple: le simple fait d’ appuyer sur TAB fait clignoter le terminal complet (une inversion vidéo rapide) si vous êtes dans l’ écran GNU .

Testé sur la plupart des systèmes Linux (Ubuntu, Kali, Debian, RaspBerry, etc.) et FreeBSD , GUI et tout terminal, local ou distant, y compris ceux de Ctrl Alt Fn .

À titre d’ exception pour cette méthode, veuillez noter ce scénario (plutôt complexe mais possible):

  • 1.- SSH dans l’ordinateur A (supposons Linux).
  • 2.- Entrez un nouvel screen -S AScr partir du terminal distant sur l’ordinateur A.
  • 3.- SSH depuis le terminal AScr écran GNU dans l’ordinateur B.
  • 4.- Entrer un nouvel screen -S BScr depuis le terminal distant sur l’ordinateur B.

Vous êtes dans un Screen sur les cas 2 et 4 et en dehors d’un Screen sur les cas 1 et 3, mais le terminal clignotera sur les cas 2, 3 et 4.

screen -ls peut vous dire

Écran extérieur:

 $ screen -ls There are screens on: 16954.pts-1.auds916 (Detached) 242.pts-8.auds916 (Detached) 2 Sockets in /tmp/screens/S-glennj. 

Dans un écran:

 $ screen -ls There are screens on: 16954.pts-1.auds916 (Attached) 242.pts-8.auds916 (Detached) 2 Sockets in /tmp/screens/S-glennj.