什么是$ DISPLAY环境变量?

我是shell脚本的新手。 我不明白$DISPLAY环境变量是什么。

我有Ubuntu 13.10,我使用/bin/bash shell。 我有两台显示器。

问题:

  1. 命令echo $DISPLAY将在我的机器上打印:0.0 (在两台显示器上)。 这是什么意思?

  2. 在哪种情况下$DISPLAY变量是空的还是NULL?

  3. 有没有关于此的文章或教程?

X窗口系统中的神奇词是DISPLAY。 显示包括(简化):

  • 键盘,
  • 一个鼠标
  • 和一个屏幕。

显示由服务器程序管理,称为X服务器。 服务器为连接到它的其他程序提供显示function。

远程服务器通过DISPLAY环境变量的定义知道它必须重定向X网络流量的位置,该变量通常指向位于本地计算机上的X Display服务器。

显示环境变量的值为:

 hostname:DS 

哪里:

hostname是运行X服务器的计算机的名称。 省略的主机名表示localhost。

D是序列号(通常为0)。 如果有多台显示器连接到一台计算机,则可以改变它。

S是屏幕编号。 显示器实际上可以有多个屏幕。 通常只有一个屏幕,但默认值为0。

值的示例

 localhost:4 google.com:0 :0.0 

hostname:DS表示主机主机名显示D上的屏幕S; 此显示器的X服务器正在侦听TCP端口6000 + D.

host/unix:DS表示主机主机D的屏幕S; 此显示的X服务器正在UNIX域套接字/tmp/.X11-unix/XD中侦听(因此只能从主机访问)。

:DS等同于host / unix:DS,其中host是本地主机名。

:0.0表示我们正在讨论连接到本地主机中第一个显示器的第一个屏幕

在这里 , 这里和这里阅读更多。

从X(7)手册页:

从用户的角度来看,每个X服务器都有一个表单的显示名称:

主机名:displaynumber.screennumber在

应用程序使用此信息来确定它应如何连接到服务器以及默认情况下应使用的屏幕(在具有多个监视器的显示器上):

hostname hostname指定显示器物理连接的计算机的名称。 如果未给出主机名,则将使用与同一台计算机上的服务器进行通信的最有效方式。 displaynumber短语“display”通常用于表示共享公共键盘和指针(鼠标,平板电脑等)的监视器集合。 大多数工作站往往只有一个键盘,因此只有一个显示器。 但是,较大的多用户系统通常具有多个显示器,因此不止一个人可以同时进行图形处理。 为避免混淆,当启动该显示器的X服务器时,将为机器上的每个显示器分配一个显示编号(从0开始)。 显示编号必须始终以显示名称给出。 screennumber某些显示器在两个或多个监视器之间共享一个键盘和指针。 由于每个监视器都有自己的一组窗口,因此当启动该显示的X服务器时,会为每个屏幕分配一个屏幕编号(从0开始)。 如果未给出屏幕编号,将使用屏幕0。

现有答案未能解决更广泛的问题。

如果您没有使用图形环境(即您在没有窗口等的系统控制台上登录;或者您是通过SSH或类似文本从纯文本终端远程登录,例如从运行PuTTY的Windows计算机登录)不涉及GUI,并且通常将取消设置DISPLAY 。 您与计算机通信的唯一方法是命令行(如果您知道如何,可能有方法可以转入GUI会话)。

如果您使用图形界面登录控制台(在Ubuntu上,通常使用GDM欢迎程序)或使用图形终端(例如从运行eXceed或mobaX的Windows计算机或VNC客户端等远程桌面软件) DISPLAY变量由管理图形会话的程序设置,以向图形客户端指示要连接的I / O设备。

传统上,Ubuntu计算机上的GUI运行X.org,X11实现,尽管最近,Canonical引入了名为Mir的现代化替代品; 而且最近,我相信Mir将被抛弃,支持另一个名为Wayland的大致相似的项目 。 这些替换旨在降低完整X11堆栈的复杂性,我们不会在这里进行 – 它们遵循相同的DISPLAY约定,这是我们在此讨论的所有内容。

在X11上, DISPLAY的主机部分可能是远程服务器,您可以使用Ubuntu计算机作为“图形终端”来访问该远程服务器上的文件和程序(在这种情况下,您的计算机是“服务器”,它服务于键盘,鼠标和一个或多个显示设备到“远程…服务器上运行的”客户端“程序”。 更常见的是,X11(或Mir,或Wayland)服务器和客户端程序(桌面管理器和各种图形客户端,如Web浏览器,电子邮件客户端,日历程序等)都可以在您的计算机上运行。 这由DISPLAY值的“server”部分指示,在后一种情况下通常为空(这意味着默认值为localhost )。

X11服务器可以运行一个或多个图形会话 – 例如,您的控制台登录和远程VNC会话可以同时运行。 在这种情况下(如果它们由相同的X11服务器实例管理),您在X11术语中有多个“显示”。 实际上,一个会话(一个登录事件和从中生成的桌面实例)是X11中的一个显示。

一个这样的显示器可以具有一个或多个屏幕。 传统上,这意味着一台显示器,尽管原始架构有一些不幸的特征,例如无法将窗口从一个屏幕移动到另一个屏幕。 像Xinerama和Xrandr这样的附加组件进一步混淆了这种情况,即一个屏幕经常以各种方式连接多个显示器。

如果您使用过多显示器系统,您可能已经发现可以通过各种方式安排显示器,并最终得到一个矩形区域,监视器显示其中的某些部分,而其他部分未分配给任何监视器。 这是X11创建的“屏幕”,如果您有多个显示卡,您可以拥有多个这些屏幕,每个屏幕分配给一个或多个显示器(或理论上,在没有显示器的情况下运行; Xvfb利用此function允许您可以在没有任何监视器的情况下运行X11,只需将GUI映射到内存区域,无论出于何种目的)。

echo $ DISPLAY将在我的机器上打印:0.0(在两台显示器上)。 这意味着什么?

:0.0表示显示编号0和屏幕编号0

在哪种情况下$ DISPLAY将为空或NULL?

如果您的$ DISPLAY出现错误,这种情况通常不会发生

有没有关于此的文章或教程?

一些教程和资源可以在这里找到:

  • 1
  • 2
  • 3

来自https://help.ubuntu.com/community/EnvironmentVariables :

可变显示

值示例:

 :0.0 localhost:10.0 terminal01:0.0 

它的用途是什么?

此变量用于向图形应用程序指示显示实际图形用户界面的位置,该值由3部分组成:主机名后跟冒号(:),显示数字后跟点(。)和屏幕数。

主机名部分可用于将图形输出通过网络发送到远程机器。 当输出用于在本地计算机上运行的X服务器时,可以省略它。 显示编号允许在同一台机器上运行的多个X服务器中进行选择(Ubuntu使用多个X服务器来启用多个图形桌面会话)。

尽管屏幕编号用于在由同一X服务器管理的多个物理屏幕中进行选择,但现在很少将其设置为除“0”以外的任何其他屏幕。 现在很少需要手动设置“DISPLAY”环境变量的值,因为它可以在需要时由许多应用程序(如“GDM”和“SSH”)自动和智能地调整。