0

When creating a new shell session, the DISPLAY variable is set accordingly (it can be :0, :1, localhost:0, etc.). If I accidentally messed up the DISPLAY variable, usually I want it reset to this default value (which changes depending on setup).

My question is, how can I programmatically (via bash script) get the DISPLAY variable as it would have been when creating a new shell?

Other questions / answers usually involving just hard coding export DISPLAY=0:0 or something similar which isn't what I want (since the correct DISPLAY variable may be different)

My naive attempts

bash -c 'echo $DISPLAY'

don't work because subshells inherit the current shell variables

2 Answers 2

3

You can examine /proc/${pid}/environ. That contains the process' initial environment.

Here, $$ is the pid of the running shell. Note also that the variables are nil-character delimited. The -e option to cat will cause it to print non-printable characters (like the nil character), and the sed converts the representation of the nil characters to newlines.

$ cat -e "/proc/$$/environ" | sed 's/\^@/\n/g' | grep DISPLAY
DISPLAY=:0.0

$ export DISPLAY=broken

$ cat -e "/proc/$$/environ" | sed 's/\^@/\n/g' | grep DISPLAY
DISPLAY=:0.0
3
  • Somehow I managed to mess up the environment enough that environ was giving the incorrect display... prolly something to do with tmux-resurrect and friends...
    – Rufus
    Commented Jun 9, 2021 at 2:52
  • @Rufus if you started a new shell after mucking with DISPLAY the new shell would have the modified value (but the parent would have the original). Commented Jun 9, 2021 at 2:54
  • 2
    It should not be updated: "This file contains the initial environment that was set when the currently executing program was started via execve(2)." man proc.5 - Further " If, after an execve(2), the process modifies its environment (e.g., by calling functions such as putenv(3) or modifying the environ(7) variable directly), this file will not reflect those changes."
    – ibuprofen
    Commented Jun 9, 2021 at 2:59
0

One way I can get the correct DISPLAY is by querying the DISPLAY variable assigned to gnome-terminal-server with the following

cat /proc/$(pidof "gnome-terminal-server")/environ | tr '\0' '\n' | grep ^DISPLAY=

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .