.png)
Recentemente coloquei xset b off
no 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 set
a saída do tty e a saída do urxvt set
para 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 DISPLAY
variá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 crontab
que operam no display quando ele existe, mas funcionam de maneira diferente quando não existe. No topo do meu crontab
, defino a DISPLAY
variável como :0
mesmo que ela ainda não exista. Os scripts crontab
que começam com @reboot
serã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 DISPLAY
seria 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 TERM
variável para testar X em meus scripts.
TERM
geralmente está definido linux
como TTY e xterm
X.
Eu uso a palavra "normalmente" aqui, já que aplicativos como GNU Screen e TMux parecem mexer com a TERM
variável.
Responder4
Em um script bash comum:if [[ $DISPLAY ]]
No mesmo computador, $DISPLAY
retornará por exemplo 0:0
em um emulador de terminal, mas nada em um terminal real. Isso pode ser facilmente testado com CtrlAltF1versus CtrlAltF7.
Uma bash
condição baseada em $DISPLAY
seria a seguinte:
if [[ $DISPLAY ]]; then
…
fi
Em .profile
ou .personal
:if xhost >& /dev/null
Pela minha experiência, $DISPLAY
ainda não está definido quando .profile
, ou por extensão, .personal
são executados. Para esses casos, oresposta pelo usuário cmevoli
serve 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.