Comment savoir si la session de terminal s'exécute dans l'écran

9

Lors de l'exécution d'un script bash, je voudrais pouvoir dire s'il s'exécute dans un screen. Est-ce possible?

Je veux que cela .bashrcpuisse définir la couleur de l'invite de commande selon que les sessions sont démarrées dans un écran ou non.

J'ai découvert ce lien après avoir répondu au mien: comment savoir si je suis sur un écran?

DustByte
la source

Réponses:

10

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

Stéphane Chazelas
la source
4

Lors de l'exécution dans l'écran, votre $TERMvariable d'environnement passe à l'écran. Vous pouvez archiver le script par exemple

if [[ "$TERM" == screen* ]]; then
  echo "Running in screen"
else 
  echo "Outside screen"
fi 

Ce serait l'une des approches. echo $TERMà l'extérieur de l'écran et à nouveau echo $TERMà l'intérieur de l'écran et voyez la différence

Valentin Bajrami
la source
Mon $ TERM est réglé sur "xterm". Donc, cela ne fonctionnerait pas dans mon cas.
aakoch
1

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

if [ -z "$TMUX" ]; then
    alias tmuxa='tmux attach -d -t'
    alias tmuxc='tmux new-session -s'
    echo "You're not in a tmux session, create a new one with tmuxc, or attach to one of the ones below with tmuxa"
    tmux ls
fi
Rqomey
la source