Detectando sesión X en un script bash (.bashrc, etc.)

Detectando sesión X en un script bash (.bashrc, etc.)

Recientemente puse xset b offen mi .bashrc. Ahora me molesta el error que aparece cuando inicio sesión a través de tty o ssh, es decir, fuera de la sesión X.

Lo primero que me vino a la mente fue [[ -z "$SOME_VAR" ]] && xset b off(bueno, resulta que probarvariable configurada frente a estar vacíaes una pregunta diferente). ¿Pero cuál SOME_VAR es el correcto?

Entonces diferí setla salida de tty y la salida de urxvt setpara ver qué variables están configuradas en X y faltan en tty. Como era de esperar, hubo bastantes diferencias (enumerando sólo aquellas que me parecieron relevantes):

  • DESKTOP_SESSION
  • DISPLAY
  • GDMSESSION
  • SESSION_MANAGER
  • WINDOWID
  • WINDOWPATH
  • XAUTHORITY
  • XDG_SESSION_COOKIE
  • XDG_CONFIG_DIRS
  • XDG_DATA_DIRS
  • XDG_MENU_PREFIX

¿Cuál es el más correcto y universal para probar para detectar si estoy en una sesión X o no? ¿Algo que funcione en tantas distribuciones, plataformas y entornos de escritorio como sea posible?

¿O hay una manera incluso mejor que probar las variables de entorno?

Respuesta1

Una forma sencilla y eficaz de comprobar que su servidor de visualización está disponible y es válido es probarlo con xhost. No siempre puedes confiar en verificar un valor en la DISPLAYvariable, ya que podría estar configurado con un valor no válido.

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

La razón por la que hago esto es porque ejecuto varios scripts en mi usuario crontabque operan en la pantalla cuando existe, pero funcionan de manera diferente cuando no. En la parte superior de mi crontab, configuré la DISPLAYvariable :0aunque aún no existe. Los scripts crontabque comienzan con @rebootse iniciarán independientemente de si tiene una pantalla o no. Esto le permitirá detectar dinámicamente cuándo su pantalla aparece y desaparece dentro del mismo script.

NOTA: El >&único funciona en bash>= 4. De lo contrario use> /dev/null 2>&1

Respuesta2

Creo que comprobar DISPLAYsería el mejor enfoque.

  • Maneja inicios de sesión remotos (por ejemplo, ssh -X).
  • Está disponible en la mayoría de las plataformas, si no en todas.
  • Es independiente del administrador de ventanas/DE.

Respuesta3

Normalmente uso la TERMvariable para probar X en mis scripts.

TERMgeneralmente está configurado linuxen TTY y xtermen X.
Utilizo la palabra "generalmente" aquí, ya que aplicaciones como GNU Screen y TMux parecen interferir con la TERMVariable.

Respuesta4

En un script bash ordinario:if [[ $DISPLAY ]]

En el mismo ordenador, $DISPLAYvolverá por ejemplo 0:0en un emulador de terminal, pero nada en un terminal real. Esto se puede probar fácilmente con CtrlAltF1versus CtrlAltF7.

Una bashcondición basada en $DISPLAYtendría el siguiente aspecto:

if [[ $DISPLAY ]]; then 
fi

En .profileo .personal:if xhost >& /dev/null

Según mi experiencia, $DISPLAYaún no está establecido cuándo .profile, o por extensión, .personalse ejecutarán. Para esos casos, elrespuesta por usuario cmevolisirve mejor:

if xhost >& /dev/null; then
fi

Me encontré con este problema al definir un escritorio.CapsLock mapeo de claveseso no debería aplicarse a mi servidor.

información relacionada