Что такое переменная среды $DISPLAY?

Я новичок в написании сценариев оболочки. Я не понимаю, что за $DISPLAY переменная окружающей среды - это.

У меня есть Ubuntu 13.10, и я использую /bin/bash ракушка. У меня есть два монитора.

Вопросы:

  1. Команда echo $DISPLAY будет печатать :0.0 на моей машине (на обоих мониторах). Что это значит?

  2. В каких случаях будет $DISPLAY переменная должна быть пустой или нулевой?

  3. Есть ли какие-нибудь статьи или учебные пособия по этому поводу?

Волшебное слово в системе X window - это ДИСПЛЕЙ. Дисплей состоит (упрощенно) из:

  • клавиатура,
  • мышь
  • и экран.

Дисплеем управляет серверная программа, известная как X-сервер. Сервер предоставляет возможности отображения другим программам, которые подключаются к нему.

Удаленный сервер знает, куда он должен перенаправлять сетевой трафик X с помощью определения переменной среды отображения, которая обычно указывает на сервер отображения X, расположенный на вашем локальном компьютере.

Значение переменной среды отображения равно:

hostname:D.S

где:

имя хоста - это имя компьютера, на котором работает X-сервер. Пропущенное имя хоста означает localhost.

D - порядковый номер (обычно 0). Его можно изменять, если к одному компьютеру подключено несколько дисплеев.

S - это номер экрана. На самом деле дисплей может иметь несколько экранов. Обычно есть только один экран, хотя по умолчанию используется значение 0.

Пример значений

localhost:4google.com:0:0.0

hostname:D.S означает экран S на дисплее D имени хоста хоста; X-сервер для этого отображения прослушивает TCP-порт 6000+D.

host/unix:D.S означает экран S на дисплее D хоста хоста; X-сервер для этого отображения прослушивает сокет домена UNIX /tmp/.X11-unix/XD (поэтому он доступен только с хоста).

:D.S эквивалентно host/unix:D.S, где host - это локальное имя хоста.

:0.0 означает, что мы говорим о первом экране, подключенном к вашему первому дисплею на вашем локальном хосте

Подробнее здесь: support.objectplanet.com и здесь: superuser.com и здесь: docstore.mik.ua.

С справочной страницы X(7):

С точки зрения пользователя, каждый X-сервер имеет отображаемое имя формы:

имя хоста:номер дисплея.номер экрана

Эта информация используется приложением для определения того, как оно должно подключаться к серверу и какой экран оно должно использовать по умолчанию (ondisplayes с несколькими мониторами):

имя хоста Имя хоста указывает имя компьютера, к которому физически подключен дисплей. Если имя хоста не указано, будет использоваться наиболее эффективный способ связи с сервером на той же машине. номер дисплея Фраза "дисплей" обычно используется для обозначения набора мониторов, которые используют общую клавиатуру и указатель (мышь, планшет и т.д.). Большинство рабочих станций, как правило, имеют только одну клавиатуру и, следовательно, только один дисплей. Однако более крупные многопользовательские системы часто имеют несколько дисплеев, так что графическую работу одновременно могут выполнять несколько человек. Чтобы избежать путаницы, каждому дисплею на компьютере присваивается номер дисплея (начинающийся с 0) при запуске Xserver для этого дисплея. Отображаемый номер всегда должен быть указан в отображаемом имени. номер экрана Некоторые дисплеи совместно используют одну клавиатуру и указатель между двумя или более мониторами. Поскольку каждый монитор имеет свой собственный набор окон, каждому экрану присваивается номер экрана (начинающийся с 0) при запуске X-сервера для этого дисплея. Если номер экрана не указан, будет использоваться экран 0.

Существующие ответы не учитывают более широкую картину.

Если вы не используете графическую среду (т.Е. Вы входите в систему на системной консоли без Windows и т.д.; или вы входите в систему удаленно с текстового терминала по SSH или аналогичного, например, с компьютера под управлением Windows, на котором работает PuTTY), тогда графический интерфейс не задействован, и DISPLAY обычно будет сброшен. Ваше единственное средство связи с компьютером - это командная строка (хотя могут быть способы перехода к сеансу графического интерфейса, если вы знаете, как это сделать).

Если вы входите в систему на консоли с графическим интерфейсом (в Ubuntu обычно используется GDM greeter) или с помощью графического терминала (например, с компьютера под управлением Windows под управлением eXceed или mobaX или программного обеспечения для удаленного рабочего стола, такого как клиент VNC), DISPLAY переменная настраивается программой, которая управляет вашим графическим сеансом, чтобы указывать графическим клиентам, к каким устройствам ввода-вывода подключаться.

Традиционно графический интерфейс на компьютере с Ubuntu был запущен X.org , реализация X11, хотя совсем недавно Canonical представила модернизированную замену под названием Mir; и даже совсем недавно, я полагаю Мир будет оставлен в пользу другого проекта с аналогичными целями под названием Wayland. Эти замены предназначены для уменьшения сложности полного стека X11, в который мы здесь не будем вдаваться - они придерживаются того же DISPLAY конвенция, которая, в конце концов, и есть то, что мы здесь обсуждаем.

На X11 хост-часть DISPLAY может быть удаленным сервером, и вы бы использовали свой компьютер Ubuntu в качестве "графического терминала" для доступа к файлам и программам на этом удаленном сервере (в этом случае ваш компьютер является "сервером", который обслуживает клавиатуру, мышь и одно или несколько устройств отображения для "клиентских" программ, запущенных на пульт дистанционного управления ... сервер). Чаще всего сервер X11 (или Mir, или Wayland) и клиентские программы (менеджер рабочего стола и различные графические клиенты, такие как веб-браузер, почтовый клиент, программа календаря и т.д.) запускаются на вашем компьютере. На это указывает раздел "сервер" в DISPLAY значение, которое в последнем случае обычно является пустым (что подразумевает значение по умолчанию, localhost).

Сервер X11 может запускать один или несколько графических сеансов - например, ваш консольный логин и удаленный сеанс VNC могут выполняться одновременно. В этом случае (если они управляются одним и тем же экземпляром сервера X11) у вас есть более одного "отображения" в терминах X11. На практике один сеанс (одно событие входа в систему и созданный на его основе экземпляр рабочего стола) - это одно отображение в X11.

Один такой дисплей может иметь один или несколько экранов. Традиционно это означало один монитор, хотя оригинальная архитектура имела некоторые неудачные черты, такие как невозможность перемещать окно с одного экрана на другой. Такие дополнения, как Xinerama и Xrandr, еще больше запутали ситуацию до такой степени, что один экран часто соединяет несколько мониторов различными способами.

Если вы играли с системами с несколькими мониторами, вы, вероятно, обнаружили, что вы можете расположить мониторы различными способами и в итоге получить прямоугольную область, где ваши мониторы отображают некоторые ее части, а другие части не назначены ни одному монитору. Это "экран", который создает X11, и если у вас более одной карты отображения, у вас может быть несколько таких экранов, каждый из которых назначен одному или нескольким мониторам (или, теоретически, работает без монитора; Xvfb использует это, чтобы позволить вам запускать X11 без каких-либо мониторов, просто сопоставляя графический интерфейс к области памяти для любой цели).

От https://help.ubuntu.com/community/EnvironmentVariables:

Переменный ДИСПЛЕЙ

Пример значений:

:0.0localhost:10.0terminal01:0.0

Для чего это нужно?

Эта переменная используется для указания графическим приложениям, где отображать фактический графический пользовательский интерфейс, значение состоит из 3 частей: имя хоста, за которым следует двоеточие (:), номер дисплея, за которым следует точка (.) и номер экрана.

Часть имени хоста может использоваться для отправки графического вывода на удаленную машину по сети. Его можно опустить, если выходные данные предназначены для X-сервера, работающего на локальном компьютере. Отображаемый номер позволяет выбирать между несколькими X-серверами, работающими на одном компьютере (Ubuntu использует несколько X-серверов для включения нескольких сеансов графического рабочего стола).

Хотя номер экрана используется для выбора среди нескольких физических экранов, управляемых одним и тем же X-сервером, в настоящее время он редко устанавливается на что-либо, кроме "0". Ручная настройка значения переменной окружения "DISPLAY" в настоящее время редко требуется, поскольку она может быть автоматически и разумно настроена многими приложениями, такими как "GDM" и "SSH", когда это необходимо.

echo $DISPLAY выведет :0.0 на моем компьютере (на обоих мониторах). Что это значит?

:0.0 означает номер дисплея 0 и номер экрана 0

В каком случае $DISPLAY будет пустым или нулевым?

В случае ошибки в вашем $DISPLAY, и это обычно не происходит

Есть ли какие-нибудь статьи или учебные пособия по этому поводу?

Некоторые учебные пособия и ресурсы можно найти здесь:

Недавно я написал несколько сценариев для автоматического запуска Firefox в определенное время, чтобы напомнить мне о включении и выключении часов, так как я работаю из дома. Я узнал, что в DISPLAY переменная определяется дисплейным менеджером, т.е. GDM3, LightDM и т.д. Я также сделал открытие, что :0 или :1 определяется с помощью AutomaticLogin. В GDM3, если у меня отключен AutomaticLogin, то мой DISPLAY переменная - это :1. Если у меня включен автоматический вход в систему, DISPLAY это сейчас :0. Эти цифры не меняются независимо от количества мониторов, которые я подключил к своей системе.

Причина, по которой это важно, заключается в том, что я использую cron чтобы запустить скрипт для меня в определенное время, чтобы запустить Firefox. cron не имеет установленных переменных, на самом деле они очень ограничены, поэтому в верхней части моего скрипта после моей строки SheBang у меня есть эта строка для экспорта моего DISPLAY тип. Без экспорта DISPLAY в скрипте, который вызывается crontab, Firefox не запустится и вместо этого выдаст сообщение об ошибке, поскольку нет 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"

Сегодня echo $DISPLAY печатает :0, А НЕ :0.0

проверка этого поможет в случае пробелов или ошибок: command line - How to know which processes have the DISPLAY variable set? - Ask Ubuntu