如何诱使程序认为没有X服务器正在运行


28

我有可以与文本用户界面和图形用户界面一起运行的程序。

它没有任何命令行开关来强制一个或另一个,而是我猜测它会以某种方式自动检测我们是否在X中(例如,如果我从虚拟终端运行它,则进入文本模式,如果我从X终端运行它, X终端仿真器,它将打开一个单独的图形窗口)。

我想将其强制为文本模式,并使其在X终端中运行。我将如何去做?

Answers:


40

通常只是

unset DISPLAY

在终端的命令行中。某些应用程序比这更聪明,并且可以实际检查控制台的权限和类型,而不是伪终端。


7
不幸的是,某些真正固执的软件会假定DISPLAY=:0它尚未设置。我相信您可以通过在其他用户下运行它并使用iptables丢弃回送X11来解决此问题,但这非常麻烦。
凯文(Kevin)

2
@凯文也许DISPLAY=invalid:0吗?
sourcejedi

2
@PeterCordes,也可以通过env而不是子env -u DISPLAY emacs foo.c
外壳

2
@PeterCordes emacs确实具有禁用X的命令行标志。只需键入emacs -nw。但是,如果没有,您可以改用DISPLAY= emacs,它也可以正常工作。
卡巴斯德'18

2
DISPLAY=0.0.0.0:0不执行名称服务器查找而立即失败。

31

如果要为单个命令禁用X,则可以编写

DISPLAY= ./my_command

注意=。之后的战略空白。更一般而言,您可以通过在命令前添加一系列<variable>=<value>以空格分隔的前缀来设置进程的环境变量。由于空格用作分隔符,因此=紧随其后的空格将清除前面的变量。我们可以通过使用subshel​​l作为命令,然后打印其环境来查看这些前缀的效果。举个例子:

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

这将打印

a b d

这表明子外壳的环境确实与预期的不同。请注意,shell替换是在将各个参数传递给之前发生的echo,因此输出之间b和之间只有一个空格d,就像命令行中echo a b d有两个空格一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.