Option 1: just use /etc/launchd.conf
Add a line like
setenv PATH /Users/username/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
to /etc/launchd.conf
and restart to apply the changes.
The default path is /usr/bin:/bin:/usr/sbin:/sbin
.
/etc/launchd.conf
applies to all processes, which includes graphical applications, non-login shells, and programs started by launchd jobs.
Edit /etc/launchd.conf
manually if you see that some program or installer has added new paths to /etc/paths
or /etc/paths.d/*
.
Option 2: use a launchd job to set the path during startup
Save this plist as /Library/LaunchDaemons/setpath.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>setpath</string>
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-c</string>
<string>launchctl setenv PATH "$((launchctl getenv PATH|tr : \\n
cat /etc/paths /etc/paths.d/*)|awk '!a[$0]++'|paste -sd: -)"</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
The program should be run the next time you restart. It changes the PATH
of the root launchd
process, which is inherited by the user launchd
process.
In my opinion it's easier to just edit /etc/launchd.conf
though.
Option 3: make bash run path_helper even for non-login shells
path_helper is run from /etc/profile
, /etc/zshenv
, and /etc/csh.login
. zsh
reads /etc/zshenv
even for non-login shells but bash
does not read /etc/profile
for non-login shells.
This makes bash
run path_helper
for interactive non-login shells and for non-interactive non-login shells:
echo 'eval $(/usr/libexec/path_helper -s)'>>~/.bashrc
setenv BASH_ENV /etc/profile|sudo tee -a /etc/launchd.conf
It does not make bash
run path_helper
for non-interactive non-login shells invoked as sh
. It also does not affect graphical applications or processes that are not started from shells.
PATH in Yosemite can and should be set within /etc/paths file. Just add your path to the end of this file:
/usr/bin
/bin
/your/custom/path
/etc/environment script in original post provides support for PATH variable in GUI applications (tested with Emacs).
Best Answer
Apparently
launchctl export
is just gone.FWIW
launchctl dumpstate
appears to contain that info (and much much more), so given enough effort, one could parse it out of there, I guess.