Como induzir um programa a pensar que não existe um servidor X em execução

28

Eu tenho este programa que pode ser executado com uma interface de usuário de texto e uma interface gráfica de usuário.

Ele não possui nenhuma opção de linha de comando para forçar um ou outro, acho que, de alguma forma, detecta automaticamente se estamos no X ou não (por exemplo, se eu executá-lo em um terminal virtual, ele entra no modo de texto e, se o executar no um emulador de terminal X, abre uma janela gráfica separada).

Eu gostaria de forçá-lo ao modo de texto e fazê-lo rodar dentro do terminal X. Como eu faria isso?

Luka Aleksić
fonte

Respostas:

40

Geralmente apenas

unset DISPLAY

na linha de comando do terminal. Alguns aplicativos são mais inteligentes que isso e, na verdade, verificam as permissões e o tipo do console em relação ao pseudoterminal.

Thomas Dickey
fonte
7
Infelizmente, algum software realmente obstinado assumirá DISPLAY=:0se não estiver definido. Eu acredito que você pode corrigir isso executando-o sob um usuário diferente e usando o iptables para soltar o loopback X11, mas isso é bastante nojento.
21718 Kevin
2
@Kevin talvez DISPLAY=invalid:0?
sourcejedi
2
@PeterCordes ou você pode executar o comando através de envem vez de um subnível:env -u DISPLAY emacs foo.c
pabouk
2
@PeterCordes emacstem um sinalizador de linha de comando para desativar o uso do X. Basta digitar emacs -nw. Mas, se não, você poderia usar o DISPLAY= emacsque também funciona.
kasperd
2
DISPLAY=0.0.0.0:0falha instantaneamente sem fazer uma pesquisa no servidor de nomes.
pts
31

Se você deseja desativar o X para um único comando, você pode escrever

DISPLAY= ./my_command

Observe o espaço em branco estratégico depois =. De maneira mais geral, você pode definir variáveis ​​de ambiente para um processo prefixando seu comando com uma sequência de <variable>=<value>espaços separados por espaços. Como o espaço serve como separador, =imediatamente seguido por um espaço limpa a variável anterior. Podemos observar o efeito desses prefixos usando um subshell como comando e imprimindo seu ambiente. Tomemos, por exemplo:

$ A=a B=b C= D=d sh
$ echo $A $B $C $D

Isso imprimirá

a b d

Isso mostra que o ambiente do subshell é realmente diferente do pretendido. Observe que a substituição do shell ocorre antes da passagem dos argumentos individuais echo; portanto, existe apenas um espaço entre be dna saída, como se a linha de comando estivesse echo a b d(com dois espaços).

tobi_s
fonte