104

The XDG specification talks about the XDG_CONFIG_HOME variable, but does not specify where it should be defined. Should we define it in /etc/X11/Xsession, or is it the window manager's config file that needs to define this?

I tried declaring it in /etc/environment as

XDG_CONFIG_HOME="$HOME/.config"

but that didn't work, as it seems that $HOME is not defined when /etc/environment is parsed.

The only documentation I could find online was for Gentoo, where it was declared in /etc/env.d/90xsession

I'm using Ubuntu. What would be the general solution for Debian based distros?

NOLFXceptMe
  • 1,342

7 Answers7

131

You don't need to define it anywhere, unless you want to change the default.

XDG Base Directory Specification clearly says:

If $XDG_CONFIG_HOME is either not set or empty, a default equal to $HOME/.config should be used.

So it is redundant to define it to the default value. All compliant applications will already use $HOME/.config

But, if you do want to change the default in a Debian/Ubuntu system, a suitable (but not the only and possibly not the best) place is:

  • For a system-wide change, affecting all users: /etc/profile
  • For your user only: ~/.profile
MestreLion
  • 3,045
  • 4
  • 29
  • 23
52

In Arch Linux, this is defined by /etc/profile, using a /etc/profile.d script.

For Debian/Ubuntu, if there's a /etc/profile.d – create a similar script inside; if such a directory does not exist – edit /etc/profile itsef.

export XDG_CONFIG_HOME="$HOME/.config"

The /etc/environment file is parsed by pam_env, which treats it as simple name=value assignments. However, it also has /etc/security/pam_env.conf, which supports variable expansion and can be used for this purpose.

Eagle-Eye
  • 204
grawity
  • 501,077
16

Elaborating on the points in the other answers regarding setting variables to the fallback values:

If one is fine with the fallback values stated in the specification, setting environment variables to duplicate the fallbacks (ie: setting $XDG_CONFIG_HOME=$HOME/.config) is not pointless or dumb. Not every program will follow the spec correctly, and having the variable set can make copying and pasting much easier.

For example, NVIDIA uses XDG_CACHE_HOME if set, otherwise improperly falls back to ~/.nv instead of ~/.cache. And you can easily wait years for something like that to be fixed.

Also, this page is a great spot to grab a bunch of environment variables to force certain programs to use your defined directories. Copying and pasting 20 of those and then setting tweaking the path is more work than having to set the XDG variables.

And to add something specific to the original question: this page has information about where to define variables.

Glorfindel
  • 4,158
MuddyArch
  • 161
  • 1
  • 2
11

I've found that it works best to set environment variables via PAM. For modern Linux distos, this means /etc/environment or $HOME/.pam_environment (see man pam_env). You can also set them in /etc/security/pam_env.conf using a special syntax. Here is how I set my XDG variables in /etc/security/pam_env.conf.

XDG_CACHE_HOME  DEFAULT=@{HOME}/.xdg/cache
XDG_CONFIG_HOME DEFAULT=@{HOME}/.xdg/config
XDG_DATA_HOME   DEFAULT=@{HOME}/.xdg/data
XDG_STATE_HOME  DEFAULT=@{HOME}/.xdg/state

Previously I would set these variables in /etc/profile.d/custom.sh. However, some applications start before that file is read. Switching to the PAM method solved the issue for multiple applications that behaved this way.

4

For Zsh users, define it in your .zshenv ~/.zprofile file

export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
smac89
  • 474
1

For Zsh, I prefer to use global zshenv directly. By specifying this default value to it - $HOME/.config, which it should know .... - using the bash substitution parameter ":="

cat >> /etc/zsh/zshenv <<- "gnark"
export ZDOTDIR="${XDG_CONFIG_HOME:=$HOME/.config}/zsh"
gnark
1

I have put it in my .zshrc file, and it works.

user35579
  • 29
  • 1