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

15

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

A primeira coisa que veio em minha mente foi [[ -z "$SOME_VAR" ]] && xset b off (bem, acontece que testar sendo definida a variável vs. estar vazia é uma questão diferente). Mas qual SOME_VAR é o correto?

Então, eu difinei set output de tty e set output de urxvt para ver quais variáveis são definidas em X e ausentes em tty. Como esperado, houve muitas diferenças (listando apenas aquelas que pareciam relevantes para mim):

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

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

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

    
por Alois Mahdal 12.04.2013 / 00:54

6 respostas

5

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

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

A razão pela qual eu faço isso é porque eu executo vários scripts no meu usuário crontab que operam no visor quando ele existe, mas funcionam de forma diferente quando não. Na parte superior do meu crontab , defino a variável DISPLAY para :0 , mesmo que ainda não exista. Scripts no 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 seu monitor aparece e entra no mesmo script.

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

    
por 20.01.2017 / 12:59
13

Acho que verificar DISPLAY seria a melhor abordagem.

  • Ele lida com logins remotos (por exemplo, ssh -X).
  • Está disponível na maioria - se não em todas as plataformas.
  • É independente do gerenciador de janelas / DE.
por 12.04.2013 / 01:02
6

Eu costumo usar a variável TERM para testar o X nos meus scripts.

TERM é geralmente definido como linux em TTY e xterm em X.
Eu uso a palavra "normalmente" aqui, já que aplicativos como o GNU Screen e o TMux parecem mexer na variável TERM .

    
por 12.04.2013 / 18:00
2

Isso deve funcionar perfeitamente:

[ ! -t 0 ] && xset b off                                  

link

-t

    file (descriptor) is associated with a terminal device

    This test option may be used to check whether the stdin [ -t 0 ] 
    or stdout [ -t 1 ] in a given script is a terminal.

Então, quando isso é avaliado como falso ( [ ! -t 0 ] ), estamos em um ambiente GUI.

    
por 14.04.2013 / 20:11
0

Existem várias maneiras de fazer isso.

No bash, tente

function xruns {
    if [[ 'pstree -As $$ | grep xinit | wc -l' == 1 ]]; then
        echo "You are in X."
    else
        echo "You are not in X."
    fi
}

Ou, em zsh, tente

#!/usr/bin/zsh

CURRENT_VT='tty'

if [[ ${CURRENT_VT[6]} == "p" ]];        # or '${CURRENT_VT:5:1}' in bash
then
   # X stuff
else 
   # non-X stuff      
fi
    
por 12.04.2013 / 19:52
0

if [[ $DISPLAY ]]

No mesmo computador, $DISPLAY retornará, por exemplo, 0:0 em um emulador de terminal, mas nada em um terminal real. Isto pode ser facilmente testado com Ctrl Alt F1 versus Ctrl Alt F7 .

Uma condição bash com base em $DISPLAY teria a seguinte aparência:

if [[ $DISPLAY ]]; then 
  …
fi
    
por 16.10.2017 / 22:12