Understanding linux DISPLAY variable
The DISPLAY
variable is used by X11 to identify your display (and keyboard and mouse). Usually it'll be :0
on a desktop PC, referring to the primary monitor, etc.
If you're using SSH with X forwarding (ssh -X otherhost
), then it'll be set to something like localhost:10.0
. This tells X applications to send their output, and receive their input from the TCP port 127.0.0.1:6010
, which SSH will forward back to your original host.
And, yes, back in the day, when "thin client" computing meant an X terminal, it was common to have several hundred displays connected to the same host.
Questions about the DISPLAY env variable
Why the :0.0?
The format is generally <ip>:<display number>.<screen number>
.
What port to forward?
VNC uses 5900 + display number.
X11 uses 6000 + display number.
No X11 DISPLAY variable - what does it mean?
If you're on the main display, then
export DISPLAY=:0.0
or if you're using csh or tcsh
setenv DISPLAY :0.0
before running your app.
Actually, I'm surprised it isn't set automatically. Are you trying to start this application from a non-graphic terminal? If not, have you modified the default .profile, .login, .bashrc or .cshrc?
Note that setting the DISPLAY to :0.0 pre-supposes that you're sitting at the main display, as I said, or at least that the main display is logged on to your user id. If it's not logged on, or it's a different userid, this will fail.
If you're coming in from another machine, and you're at the main display of that machine and it's running X, then you can use "ssh -X hostname" to connect to that host, and ssh will forward the X display back. ssh will also make sure that the DISPLAY environment variable is set correctly (providing it isn't being messed with in the various dot files I mentioned above). In a "ssh -X" session, the DISPLAY environment variable will have a value like "localhost:11.0", which will point to the socket that ssh is tunnelling to your local box.
Windows Subsystem for Linux DISPLAY variable setup
The Windows Subsystem for Linux doesn’t officially support graphical GNU/Linux desktop applications, so we have no guarantee that the calls made by our graphical program of choice will be implemented as windows system calls.
The main issue you are running into is the lack of a graphical interface to these programs, called an "X-server". We can try to get around this problem by:
- Installing an X-server (Such as Xming).
- Telling the Windows Subsystem for Linux to use this X-server as the DISPLAY by setting the environment variable.
For (1), to install Xming, you can just download and accept the default settings, it will automatically launch and wait for graphical programs to display.
To address (2), before you run your graphical program, run:
export DISPLAY=:0
so that bash knows where to send the graphical output of the program you're running.
Then you can try running a simple graphical program (for example gvim or python's turtle module).
Again, there is no guarantee that this will work for all GNU/Linux applications, since Microsoft has not translated every Linux system call to a Windows system call, and if the graphical program you're running makes such an unsupported call, your program may just crash.
Most of these instructions were taken from the following guide which shows how to get gvim working on Windows Subsystem for Linux:
http://www.howtogeek.com/261575/how-to-run-graphical-linux-desktop-applications-from-windows-10s-bash-shell/
Edit: Since you also asked about checking what's in DISPLAY
, I'm adding that you can check the value of the DISPLAY
variable by running:
echo $DISPLAY
(The $
ensures that bash interprets what follows as a variable, rather than a string literal. Running echo DISPLAY
will just echo the string DISPLAY.)
How can I specify a display?
The way that X works is the same as the way any network program works. You have a server of some description (in this case, the X display server) which runs on a specific machine, and you have X clients (like firefox) that try to connect to that server to get their information displayed.
Often (on "home" machines), the client and server run on the same box and there's only one server, but X is powerful enough that this doesn't need to happen. It was built with the server/client separation built in from the start.
This allows you to do such wondrous things such as log on to your box (in text mode) halfway around the planet, tell it that the display server is the box you're currently on and, voila, the windows suddenly start appearing locally.
In order for a client to interact with a user, it needs to know how to find the server. There are a number of ways to do this. Many clients allow the -display
or --display
option to specify it:
xeyes -display paxbox1.paxco.com:0.0
Many will use the DISPLAY
environment variable if a display isn't specifically given. You can set this variable like any other:
DISPLAY=paxbox1.paxco.com:0.0; export DISPLAY # in .profile
export DISPLAY=paxbox1.paxco.com:0.0 # in your shell
DISPLAY=paxbox1.paxco.com:0.0 firefox & # for that command (shell permitting)
The first part of the DISPLAY
variable is just the address of the display server machine. It follows the same rule as any other IP address; it can be a resolvable DNS name (including localhost
) or a specific IP address (such as 192.168.10.55).
The second part is X-specific. It gives the X "display" (X server) number and screen number to use. The first (display number) generally refers to a group of devices containing one or more screens but with a single keyboard and mouse (i.e., one input stream). The screen number generally gives the specific screen within that group.
An example would be:
+----------------------------------------+
|paxbox1.paxco.com| |
+-----------------+ |
| |
| +----------+----+ +----------+----+ |
| |Display :0| | |Display :1| | |
| +----------+ | +----------+ | |
| | | | | |
| | +-----------+ | | | |
| | |Screen :0.0| | | | |
| | +-----------+ | | | |
| | +-----------+ | | | |
| | |Screen :0.1| | | | |
| | +-----------+ | | | |
| | +-----------+ | | +-----------+ | |
| | |Screen :0.2| | | |Screen :1.0| | |
| | +-----------+ | | +-----------+ | |
| | +-----------+ | | +-----------+ | |
| | |Screen :0.3| | | |Screen :1.1| | |
| | +-----------+ | | +-----------+ | |
| | +-----------+ | | +-----------+ | |
| | | Keyboard | | | | Keyboard | | |
| | +-----------+ | | +-----------+ | |
| | +-----------+ | | +-----------+ | |
| | | Mouse | | | | Mouse | | |
| | +-----------+ | | +-----------+ | |
| +---------------+ +---------------+ |
| |
+----------------------------------------+
Here you have a single machine (paxbox1.paxco.com
) with two display servers. The first has four screens and the second has two. The possibilities are then:
DISPLAY=paxbox1.paxco.com:0.0
DISPLAY=paxbox1.paxco.com:0.1
DISPLAY=paxbox1.paxco.com:0.2
DISPLAY=paxbox1.paxco.com:0.3
DISPLAY=paxbox1.paxco.com:1.0
DISPLAY=paxbox1.paxco.com:1.1
depending on where you want your actual windows to appear and which input devices you want to use.
How to print / echo environment variables?
These need to go as different commands e.g.:
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"
The expansion $NAME
to empty string is done by the shell earlier, before running echo
, so at the time the NAME
variable is passed to the echo
command's environment, the expansion is already done (to null string).
To get the same result in one command:
NAME=sam printenv NAME
Related Topics
Linux Kill Process Using Timeout in Milliseconds
Sending Data on Af_Packet Socket
Errors While Trying to Build Gdb for Arm
Linux Shell Script - Find All Files and Run a Command on Each One of Them
Awk: Sum Up Column Values Across Multiple Files with Identical Column Layout
Different Pulic Key for Jump Host and Destination Host Over Ssh
Linux Script Telnet Head Request
Case Statement in a While Loop, Shell Scripting
Why a Static Library Can Depend on a Shared a Library
Redirecting Output of a C Program to Another C Program with a Bash Script Under Linux
How to Set Just Year with Linux Date Command
How to Put All Command Arguments in One Variable
Command or Option for The Xgettext, Msginit, Msgfmt Sequence for Setting The Mime Type