我是 shell 脚本的新手。我不明白$DISPLAY
环境变量是什么。
我有 Ubuntu 13.10 并且使用/bin/bash
shell。我有两个显示器。
问题:
命令
echo $DISPLAY
将打印:0.0
在我的计算机上(在两个显示器上)。这是什么意思?在什么情况下
$DISPLAY
变量会为空或 NULL?有没有关于这个的文章或教程?
答案1
X 窗口系统中的魔法词是 DISPLAY。显示由(简化)以下部分组成:
- 键盘,
- 一个鼠标
- 和一个屏幕。
显示器由服务器程序(称为 X 服务器)管理。该服务器为连接到它的其他程序提供显示功能。
远程服务器通过 DISPLAY 环境变量的定义知道必须将 X 网络流量重定向到何处,该 DISPLAY 环境变量通常指向位于本地计算机上的 X 显示服务器。
显示环境变量的值为:
hostname:D.S
在哪里:
hostname 是运行 X 服务器的计算机的名称。省略 hostname 表示本地主机。
D 是序列号(通常为 0)。如果一台计算机上连接了多个显示器,则该序列号可能会有所不同。
S 是屏幕编号。一个显示器实际上可以有多个屏幕。通常只有一个屏幕,其中 0 是默认值。
值的示例
localhost:4
google.com:0
:0.0
hostname:D.S
表示主机 hostname 的显示器 D 上的屏幕 S;此显示器的 X 服务器正在监听 TCP 端口 6000+D。
host/unix:D.S
表示主机 host 的显示器 D 上的屏幕 S;此显示器的 X 服务器正在监听 UNIX 域套接字 /tmp/.X11-unix/XD(因此只能从主机访问)。
:D.S
相当于 host/unix:DS,其中 host 是本地主机名。
:0.0 表示我们正在谈论本地主机中第一个显示器所连接的第一个屏幕
阅读更多这里:support.objectplanet.com和这里:superuser.com和这里:docstore.mik.ua。
来自 X(7) 手册页:
从用户的角度来看,每个 X 服务器都有一个以下形式的显示名称:
主机名:显示号.屏幕号
应用程序使用此信息来确定如何连接到服务器以及默认应使用哪个屏幕(在具有多台显示器的显示器上):
主机名 主机名指定显示器物理连接的计算机的名称。如果未指定主机名,则将使用与同一台计算机上的服务器通信的最有效方式。 displaynumber 短语“显示器”通常用于指代共享一个公共键盘和指针(鼠标、手写板等)的显示器集合。大多数工作站往往只有一个键盘,因此只有一个显示器。但是,较大的多用户系统通常有多个显示器,以便多个人可以同时进行图形工作。为避免混淆,当启动该显示器的 X 服务器时,将为计算机上的每个显示器分配一个显示器编号(从 0 开始)。显示器编号必须始终在显示器名称中给出。 screennumber 某些显示器在两个或多个显示器之间共享一个键盘和指针。由于每个显示器都有自己的一组窗口,因此当启动该显示器的 X 服务器时,将为每个屏幕分配一个屏幕编号(从 0 开始)。如果未指定屏幕编号,将使用屏幕 0。
答案2
现有的答案未能解决更广泛的问题。
如果您没有使用图形环境(即,您在没有窗口等的系统控制台上登录;或者您通过 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
,在后一种情况下通常为空(这意味着默认值localhost
)。
X11 服务器可以运行一个或多个图形会话 - 例如,您的控制台登录和远程 VNC 会话可以同时运行。在这种情况下(如果它们由同一个 X11 服务器实例管理),您在 X11 术语中拥有多个“显示”。实际上,一个会话(一个登录事件和由此产生的桌面实例)就是 X11 中的一个显示。
一个这样的显示器可以有一个或多个屏幕。传统上,这意味着一个显示器,但原始架构有一些缺点,例如无法将窗口从一个屏幕移动到另一个屏幕。Xinerama 和 Xrandr 等附加组件使情况更加复杂,以至于一个屏幕通常以各种方式连接多个显示器。
如果您曾经使用过多显示器系统,那么您可能已经发现,您可以用各种方式排列显示器,最终得到一个矩形区域,其中显示器显示部分内容,而其他部分则不分配给任何显示器。这是 X11 创建的“屏幕”,如果您有多个显示卡,则可以有多个这样的屏幕,每个屏幕分配给一个或多个显示器(或者从理论上讲,可以在没有显示器的情况下运行;Xvfb 利用这一点,允许您在没有任何显示器的情况下运行 X11,只需将 GUI 映射到内存区域即可。
答案3
从https://help.ubuntu.com/community/EnvironmentVariables:
变量- DISPLAY
值示例:
:0.0
localhost:10.0
terminal01:0.0
它是干什么用的?
此变量用于向图形应用程序指示在何处显示实际的图形用户界面,其值由 3 部分组成:主机名后跟冒号 (:)、显示号后跟点 (.) 和屏幕号。
主机名部分可用于将图形输出通过网络发送到远程计算机。当输出用于本地计算机上运行的 X 服务器时,可以省略此部分。显示编号允许在同一台计算机上运行的多个 X 服务器中进行选择(Ubuntu 使用多个 X 服务器来启用多个图形桌面会话)。
虽然屏幕编号用于在由同一 X 服务器管理的多个物理屏幕中进行选择,但如今它很少被设置为“0”以外的任何值。如今很少需要手动设置“DISPLAY”环境变量的值,因为它可以在需要时由许多应用程序(例如“GDM”和“SSH”)自动且智能地调整。
答案4
最近我一直在编写一些脚本,用于在特定时间自动启动 Firefox,以提醒我打卡上下班,因为我一直在家工作。我发现变量DISPLAY
由显示管理器(即 GDM3、LightDM 等)决定。我还发现或由 AutomaticLogin 决定。在 GDM3 中,如果我禁用了 AutomaticLogin,那么我的:0
变量就是。如果我启用了 AutomaticLogin,现在就是。无论我连接到系统的显示器数量有多少,这些数字都不会改变。:1
DISPLAY
:1
DISPLAY
:0
这之所以很重要,是因为我使用cron
在特定时间启动脚本来启动 Firefox。 cron
没有设置变量,实际上它们非常有限,所以在我的脚本顶部的 SheBang 行之后,我有此行来导出我的类型。如果不在被调用的脚本中DISPLAY
导出,Firefox 将无法启动,而是会给出错误,因为没有设置。DISPLAY
crontab
DISPLAY
#This line checks if automatic login is disabled in gdm3 and sets DISPLAY.
grep "# AutomaticLogin" /etc/gdm3/custom.conf >/dev/null && export DISPLAY=":1" || export DISPLAY=":0"