Environment Variables

Recently, I had to configure some user specific environment variables for my Linux installation. The problem was that I needed those variables to work in all of my shells and in every desktop environment. Since .pam_environment is deprecated and .profile isn't sourced by every shell, I needed another solution that works globally.

User variables

One solution is to use systemd for this task. You can configure user environment variables in the ~/.config/environment.d directory. Multiple files can be added and all of them will be processed on session start:

.
├── 10-xdg.conf
├── 20-dirs.conf
├── 30-general.conf
└── 40-apps.conf

The format inside these files is very simple:

KEY=value
KEY=value
KEY=value

They support variable expansion so it's possible to use things like $HOME in the value text. You can take a look at my environment.d if you need some examples.

GDM and KDE Plasma will automatically source these variables on session start. If you don't use these or you don't want to rely on them, you need to manually load the variables in your shell config files.

bash / zsh

export $(/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator)

fish

export (/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator)

Even if you use a graphical environment it makes sense to add these to your shell startup because it allows you to see the changes made to your environment immediately. In case you're worried about execution time, it adds about 3 ms to the shell startup on my machine and is well worth the price.

System variables

Hardware and system specific variables that do not need to live in a version controlled repository can be set in /etc/environment. For example, on a system with an Nvidia GPU:

GBM_BACKEND=nvidia-drm
LIBVA_DRIVER_NAME=nvidia
__GLX_VENDOR_LIBRARY_NAME=nvidia