Comment faire croire à un programme qu'il n'y a pas de serveur X en cours d'exécution

28

J'ai ce programme qui peut fonctionner avec une interface utilisateur texte et une interface utilisateur graphique.

Il manque un commutateur de ligne de commande pour forcer l'un ou l'autre, je suppose plutôt qu'il détecte automatiquement si nous sommes en X ou non (par exemple, si je l'exécute à partir d'un terminal virtuel, il passe en mode texte et si je l'exécute à partir de un émulateur de terminal X, il ouvre une fenêtre graphique distincte).

Je voudrais le forcer en mode texte et le faire fonctionner à l'intérieur du terminal X. Comment pourrais-je m'y prendre?

Luka Aleksić
la source

Réponses:

40

Habituellement juste

unset DISPLAY

en ligne de commande du terminal. Certaines applications sont plus intelligentes que cela et vérifient réellement les autorisations et le type de console par rapport au pseudoterminal.

Thomas Dickey
la source
7
Malheureusement, certains logiciels vraiment obstinés supposeront qu'ils ne DISPLAY=:0sont pas définis. Je pense que vous pouvez résoudre ce problème en l'exécutant sous un autre utilisateur et en utilisant iptables pour supprimer le bouclage X11, mais c'est assez dégoûtant.
Kevin
2
@ Kevin peut DISPLAY=invalid:0- être ?
sourcejedi
2
@PeterCordes ou vous pouvez exécuter la commande via envau lieu d'un sous-shell:env -u DISPLAY emacs foo.c
pabouk
2
@PeterCordes emacspossède un indicateur de ligne de commande pour désactiver l'utilisation de X. Il suffit de taper emacs -nw. Mais si ce n'est pas le cas, vous pouvez utiliser à la place DISPLAY= emacs, ce qui fonctionne également.
kasperd
2
DISPLAY=0.0.0.0:0échoue instantanément sans effectuer de recherche de serveur de noms.
pts
31

Si vous souhaitez désactiver X pour une seule commande, vous pouvez écrire

DISPLAY= ./my_command

Remarquez l'espace vide stratégique après =. Plus généralement, vous pouvez définir des variables d'environnement pour un processus en préfixant votre commande avec une séquence d' <variable>=<value>espaces séparés par. Puisque l'espace sert de séparateur, =immédiatement suivi d'un espace efface la variable précédente. Nous pouvons examiner l'effet de ces préfixes en utilisant un sous-shell comme commande, puis en imprimant son environnement. Prenez par exemple:

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

Cela imprimera

a b d

Cela montre que l'environnement de la sous-coque est en effet différent comme prévu. Notez que la substitution de shell se produit avant que les arguments individuels ne soient passés à echo, il n'y a donc qu'un seul espace entre bet ddans la sortie, comme si la ligne de commande l'était echo a b d(avec deux espaces).

tobi_s
la source