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