So täuschen Sie ein Programm vor, dass kein X-Server ausgeführt wird

28

Ich habe dieses Programm, das mit einer Textbenutzeroberfläche und einer grafischen Benutzeroberfläche ausgeführt werden kann.

Es fehlt ein Befehlszeilenschalter, um den einen oder anderen zu erzwingen. Ich schätze, er erkennt irgendwie automatisch, ob wir uns in X befinden oder nicht (z. B. wenn ich ihn von einem virtuellen Terminal aus starte, wechselt er in den Textmodus, und wenn ich ihn von dort aus starte Ein X-Terminal-Emulator öffnet ein separates Grafikfenster.

Ich möchte es in den Textmodus zwingen und es im X-Terminal ausführen lassen. Wie würde ich das machen?

Luka Aleksić
quelle

Antworten:

40

Normalerweise nur

unset DISPLAY

in der Kommandozeile des Terminals. Einige Anwendungen sind intelligenter als das und überprüfen tatsächlich die Berechtigungen und den Typ der Konsole im Vergleich zu Pseudoterminal.

Thomas Dickey
quelle
7
Leider wird einige wirklich hartnäckige Software annehmen, DISPLAY=:0wenn sie nicht eingestellt ist. Ich glaube, Sie können das beheben, indem Sie es unter einem anderen Benutzer ausführen und iptables verwenden, um Loopback X11 zu löschen, aber das ist ziemlich grob.
Kevin
2
@ Kevin vielleicht DISPLAY=invalid:0?
Sourcejedi
2
@PeterCordes oder Sie können den Befehl durch envanstelle einer Unterschale ausführen:env -u DISPLAY emacs foo.c
Pabouk
2
@PeterCordes emacsverfügt über ein Befehlszeilen-Flag, mit dem die Verwendung von X deaktiviert werden kann. Geben Sie einfach Folgendes ein emacs -nw. Aber wenn nicht, könnten Sie stattdessen verwenden DISPLAY= emacs, was auch funktioniert.
Kasperd
2
DISPLAY=0.0.0.0:0schlägt sofort fehl, ohne einen Nameserver-Lookup durchzuführen.
Pkt
31

Wenn Sie X für einen einzelnen Befehl deaktivieren möchten, können Sie schreiben

DISPLAY= ./my_command

Beachten Sie die strategische Leerstelle nach =. Im Allgemeinen können Sie Umgebungsvariablen für einen Prozess festlegen, indem Sie Ihrem Befehl eine <variable>=<value>durch Leerzeichen getrennte Folge voranstellen. Da das Leerzeichen als Trennzeichen dient, wird =die vorhergehende Variable durch ein unmittelbares Leerzeichen gelöscht. Wir können die Auswirkung dieser Präfixe untersuchen, indem wir eine Subshell als Befehl verwenden und dann ihre Umgebung drucken. Nimm zum Beispiel:

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

Dies wird gedruckt

a b d

Dies zeigt, dass die Umgebung der Unterschale tatsächlich anders ist als beabsichtigt. Beachten Sie, dass die Shell-Ersetzung erfolgt, bevor die einzelnen Argumente übergeben werden echo, sodass zwischen bund din der Ausgabe nur ein einziges Leerzeichen vorhanden ist , genau wie in der Befehlszeile echo a b d(mit zwei Leerzeichen).

tobi_s
quelle