Skip to content

Instantly share code, notes, and snippets.

@bagonyi
Created March 4, 2016 16:38
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bagonyi/6ea345a7eb3ad5545272 to your computer and use it in GitHub Desktop.
Save bagonyi/6ea345a7eb3ad5545272 to your computer and use it in GitHub Desktop.
OS X El Capitan ZSH order of PATH set in .zshenv is not respected
According to http://www.zsh.org/mla/users/2015/msg00727.html the order gets overwritten by path_helper.
If you move your $PATH settings from ~/.zshenv to ~/.zprofile path_helper won't override your PATH settings.
On 7/31/15 2:53 PM, Mikael Magnusson wrote:
On Fri, Jul 31, 2015 at 6:35 PM, Kurtis Rader <krader@xxxxxxxxxxxxx> wrote:
A public service announcement for those running Zsh on Mac OS X.
Upgrading to El Capitan (OS X 10.11) will install a /etc/zprofile that
contains
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
On a new login shell that will be sourced after your $HOME/.zshenv. If you
set your $PATH in your .zshenv the /usr/libexec/path_helper program will
alter the order of the directories. The order appears random so it's
probably using a hashed set to avoid having the same directory appear more
than once in the result.
You can't remove /usr/libexec/path_helper due to the new security
mechanisms (at least not without booting from a recovery disk) but you can
remove /etc/zprofile which is what I did to keep my $PATH from being mucked
with.
That's good news, they used to have that code in /etc/zshenv which
meant you had _no_ way to override it. It only took them a few years
to fix this.
As a sidenote, it's not a great idea to set your path in .zshenv, you
should probably move those settings to your .zprofile. (Otherwise,
running a script that uses zsh will not use the $PATH from the
environment, which can break things in some situations).
I suspect the order of entries in path_helper is determined by alphabetical ordering of the filenames in /etc/paths.d, where path_helper locates the files that come after the default system paths. That "40-" in XQuartz looks like an rcdir-style technique to enforce ordering, and I think the XQuartz folks know what they're doing with the OS X system stuff. (This is on 10.9.)
$ ls -l /etc/paths.d
total 16
-rw-r--r-- 1 root wheel 13 Aug 11 2014 40-XQuartz
-rw-r--r-- 1 root wheel 12 May 7 21:06 TeX
Playing around with this seems to support that theory. Files read in order, duplicate entries removed after the first occurrence.
#/bin/sh
# install-hello-paths - script to test path_helper behavior
echo /hello/world > /etc/paths.d/01-hello
echo /hello/world > /etc/paths.d/99-hello
One other El Capitan change: the system-supplied zsh (5.0.8) appears to be compiled with /usr/local/share/zsh/site-functions in the default $fpath, which was not the case for earlier versions of OS X. This is probably related to the "rootless" stuff that locks down /usr outside /usr/local/.
Cheers,
Andrew
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment