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

Luk*_*sić 28 x11

我有这个程序可以在文本用户界面和图形用户界面下运行。

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

我想强制它进入文本模式并让它在 X 终端内运行。我将如何去做?

Tho*_*key 40

通常只是

unset DISPLAY
Run Code Online (Sandbox Code Playgroud)

在终端的命令行中。有些应用程序比这更聪明,实际上检查控制台与伪终端的权限和类型。

  • 不幸的是,如果未设置,一些非常顽固的软件会假定`DISPLAY=:0`。我相信您可以通过在不同的用户下运行它并使用 iptables 删除环回 X11 来解决这个问题,但这很糟糕。 (7认同)
  • @Kevin 也许`DISPLAY=invalid:0` ? (2认同)
  • @PeterCordes 或者你可以通过 `env` 而不是子 shell 来执行命令:`env -u DISPLAY emacs foo.c` (2认同)
  • @PeterCordes `emacs` 确实有一个命令行标志来禁用 X 的使用。只需输入 `emacs -nw`。但如果没有,你可以改用`DISPLAY= emacs`,它也能工作。 (2认同)
  • `DISPLAY=0.0.0.0:0` 立即失败,无需进行名称服务器查找。 (2认同)

tob*_*i_s 31

如果您想为单个命令禁用 X,您可以编写

DISPLAY= ./my_command
Run Code Online (Sandbox Code Playgroud)

请注意=.之后的战略空白区域。更一般地,您可以通过在命令前加上<variable>=<value>由空格分隔的序列来为进程设置环境变量。由于空格用作分隔符,=紧随其后的空格会清除前面的变量。我们可以通过使用子shell作为命令然后打印其环境来查看这些前缀的效果。举个例子:

$ A=a B=b C= D=d sh
$ echo $A $B $C $D
Run Code Online (Sandbox Code Playgroud)

这将打印

a b d
Run Code Online (Sandbox Code Playgroud)

这表明子shell的环境确实与预期不同。请注意,shell 替换发生在将单个参数传递给 之前echo。这意味着echo将使用三个参数调用,因此输出之间bd输出中只有一个空格,就像命令行一样echo a b d(即使在d它只打印单个空格之前有两个空格),但不像echo a b "" d(它打印两个空格)bd)之间的空格。