Detectando sessão X em um script bash (.bashrc etc.)

Detectando sessão X em um script bash (.bashrc etc.)

Recentemente coloquei xset b offno meu .bashrc. Agora estou irritado com o erro que aparece quando faço login via tty ou via ssh, ou seja, fora da sessão X.

A primeira coisa que me veio à mente foi [[ -z "$SOME_VAR" ]] && xset b off(bem, acontece que o testevariável sendo definida versus vaziaé uma pergunta diferente). Mas qual SOME_VAR é o correto?

Então, diferenciei seta saída do tty e a saída do urxvt setpara ver quais variáveis ​​​​estão definidas no X e ausentes no tty. Como esperado, houve muitas diferenças (listando apenas aquelas que me pareceram relevantes):

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

Qual é o mais correto e universal para testar para detectar se estou em uma sessão X ou não? Algo que funcionaria em tantas distros, plataformas e ambientes de desktop quanto possível?

Ou existe uma maneira ainda melhor do que testar variáveis ​​de ambiente?

Responder1

Uma maneira simples e eficaz de testar se seu servidor de exibição está disponível e é válido é testá-lo com xhost. Você nem sempre pode confiar na verificação de um valor na DISPLAYvariável, pois ela pode ser definida com um valor inválido.

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

A razão pela qual faço isso é porque executo vários scripts em meu usuário crontabque operam no display quando ele existe, mas funcionam de maneira diferente quando não existe. No topo do meu crontab, defino a DISPLAYvariável como :0mesmo que ela ainda não exista. Os scripts crontabque começam com @rebootserão iniciados independentemente de você ter uma exibição ou não. Isso permitirá que você detecte dinamicamente quando sua exibição entra e sai dentro do mesmo script.

NOTA: >&Só funciona em bash>= 4. Caso contrário, use> /dev/null 2>&1

Responder2

Acho que verificar DISPLAYseria a melhor abordagem.

  • Ele lida com logins remotos (por exemplo, ssh -X).
  • Ele está disponível na maioria das plataformas, senão em todas.
  • É independente do gerenciador de janelas/DE.

Responder3

Normalmente uso a TERMvariável para testar X em meus scripts.

TERMgeralmente está definido linuxcomo TTY e xtermX.
Eu uso a palavra "normalmente" aqui, já que aplicativos como GNU Screen e TMux parecem mexer com a TERMvariável.

Responder4

Em um script bash comum:if [[ $DISPLAY ]]

No mesmo computador, $DISPLAYretornará por exemplo 0:0em um emulador de terminal, mas nada em um terminal real. Isso pode ser facilmente testado com CtrlAltF1versus CtrlAltF7.

Uma bashcondição baseada em $DISPLAYseria a seguinte:

if [[ $DISPLAY ]]; then 
fi

Em .profileou .personal:if xhost >& /dev/null

Pela minha experiência, $DISPLAYainda não está definido quando .profile, ou por extensão, .personalsão executados. Para esses casos, oresposta pelo usuário cmevoliserve melhor:

if xhost >& /dev/null; then
fi

Encontrei esse problema ao definir uma área de trabalhoCapsLock mapeamento de teclasisso não deve se aplicar ao meu servidor.

informação relacionada