Cómo saber si la sesión de terminal se ejecuta dentro de la pantalla

9

Al ejecutar un script bash, me gustaría poder saber si se está ejecutando dentro de a screen. es posible?

Quiero esto para que .bashrcpueda establecer el color del símbolo del sistema dependiendo de si las sesiones se inician dentro de una pantalla o no.

Descubrí este enlace una vez que el mío fue respondido: ¿Cómo puedo saber si estoy en una pantalla?

DustByte
fuente

Respuestas:

10

Por lo general, $STYse establecerá.

Entonces:

if [ -n "$STY" ]; then
  echo "I'm most likely running under screen"
fi

$STYnormalmente es lo que necesitas para hablar con tu screen. Eso se usa para construir la ruta del socket del dominio Unix que se usa para controlar screen(algo así como /var/run/screen/S-$USER/$STY.

Ahora, eso no funcionará, por ejemplo, si desde esa pantalla, usted ssha otra máquina. El shell iniciado allí no tendrá $STYen su entorno, y eso no sería de ninguna utilidad, ya que no podría acceder a los zócalos de dominio Unix en su máquina.

Sin embargo, es posible consultar el terminal con una secuencia de escape para determinar su 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

Otro enfoque, como lo sugiere @ val0x00ff es verificar el valor de la $TERMvariable de entorno. Ese valor está destinado a indicar a las aplicaciones con qué tipo de terminal están hablando. Se establece screenen algo que comienza con screen(ya que screenpuede implementar diferentes variantes de terminales). $TERMse pasa al otro lado rlogin, rsh, telnet, ssh. No es tan seguro que funcione como lo anterior, pero es más simple y menos intrusivo.

case $TERM in
  (screen*) echo "I'm more than likely running in screen"
esac

Al igual que para la solución anterior, es posible que se esté ejecutando screen, pero es posible que no pueda emitir comandos con él, screen -Xpor ejemplo. Sin embargo, tenga en cuenta que puede pasar comandos usando secuencias de escape (aunque no está habilitado de forma predeterminada por razones de seguridad).

Stéphane Chazelas
fuente
4

Cuando se ejecuta en la pantalla, la $TERMvariable de entorno cambia a la pantalla. Puede consultar el script, por ejemplo

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

Ese sería uno de los enfoques. echo $TERMfuera de la pantalla y nuevamente echo $TERMdentro de la pantalla y ver la diferencia

Valentin Bajrami
fuente
Mi $ TERM se establece en "xterm". Entonces, esto no funcionaría en mi caso.
aakoch
1

Yo mismo uso tmux, y este poquito para enumerar sesiones solo si aún no estoy en una sesión de 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
fuente