zsh and /etc/profile


I just upgraded from zsh v5.5 to zsh v5.9 and some of my applications broke.

It seems the environment variable $XDG_DATA_DIRS was blanked out in the process.

$XDG_DATA_DIRS holds the location of directories which can contain .desktop files. The .desktop files are basically application shortcuts in the Linux desktop world.

The $XDG_DATA_DIRS and several such variables are initialized by scripts placed in /etc/profiles.d folder. This folder is executed by the /etc/profile script.

Now, the twist is that the /etc/profile is only invoked by bash shell

zsh uses its own set of configuration files:

  • /etc/zsh/zprofile
  • /etc/zsh/zshrc
  • /etc/zsh/zlogin
  • /etc/zsh/zshenv

Most modern distros will have a mechanism where in /etc/zsh/zprofile will invoke the /etc/profile which in turn will invoke all the scripts placed inside /etc/profiles.d folder.

However, if you are using the older distro or a non-Desktop distros such as CentOS, RedHat, this might not be the case.

In that case, you need to setup that linkage manually. In my case, I created the file /etc/zsh/zprofile with the contents

emulate sh -c 'source /etc/profile'

One other thing I found that some distros might invoke /etc/zprofile , instead of /etc/zsh/zprofile.

In that case, you might want to symlink the files with

sudo ln -s /etc/zsh/zprofile /etc/zprofile