Como o script detecta se o emulador de terminal está sendo executado em uma sessão da área de trabalho ou não?

10

Eu tenho scripts que escrevo que gravam um arquivo de texto e o abro em um editor. Se eu abrir uma janela do emulador de terminal na minha sessão da área de trabalho e executar o script, gostaria que o editor fosse um gráfico como gedit . Mas, se eu estiver conectado através do ConnectBot no meu telefone ou similar (sem sessão de desktop), eu gostaria que o editor fosse nano .

Atualmente eu tenho que manter dois scripts diferentes, idênticos, exceto para a última etapa (ou deixar a parte gráfica executar, errar e abrir manualmente o arquivo em nano ). Ter dois scripts praticamente idênticos é ineficiente do ponto de vista de manutenção.

Um script pode detectar em qual dessas situações eu estou e abrir o editor correto?

(Eu encontrei maneiras de um script detectar se ele está sendo executado em uma janela do emulador de terminal ou clicando duas vezes, mas ainda não encontrei uma maneira de detectar se a janela está sendo executada em uma área de trabalho ... Acho que sei a terminologia correta para o google para)

    
por Organic Marble 21.05.2018 / 12:10

3 respostas

13

Você pode usar a variável de ambiente $DISPLAY como acionador dentro de uma condição if . Geralmente, quando essa variável tem um valor, você pode executar aplicativos gráficos.

Veja um exemplo bash :

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

O operador -z retornará true quando o envvar $DISPLAY estiver vazio e seu script for executado nano ; em todos os outros casos, ele será executado gedit .

De acordo com este comentário de @ vurp0 :

On most modern Wayland desktops (like the default desktop in Fedora and Ubuntu), $DISPLAY is still set due to backwards compatibility (through XWayland), but for a more robust script it would be good to test for both $DISPLAY and $WAYLAND_DISPLAY to be sure.

Sugiro modificar a expressão de teste da seguinte maneira:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

Assim, os valores das duas variáveis serão concatenados em uma string comum, que será processada pelo operador -z .

Referências:

por pa4080 21.05.2018 / 12:28
7

Geralmente, os terminais virtuais usam /dev/pts pseudo-terminals . Portanto, com base na saída do comando tty , podemos criar uma instrução case simples para manipular a abertura de um editor específico:

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

Ou formatado melhor:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

Comparado ao uso de variáveis de ambiente, isso é um pouco mais confiável e considerando que ele usa o comando case com o comando tty um pouco mais portátil. O que provavelmente seria melhor é combinar ambos, com testes extras, como "/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;

    
por Sergiy Kolodyazhnyy 22.05.2018 / 10:08
3

Isso é o que eu tenho usado:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

A razão para este código foi esta pergunta: Desktop atalho para Bash o script trava e queima

Você pode modificá-lo para ficar assim:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
    
por WinEunuuchs2Unix 22.05.2018 / 12:05