Modifying the PATH environment variable system-wide on macOS requires deeper system integration than typical Unix systems because of Apple's launchd architecture. While ~/.bash_profile
or ~/.zshrc
works for terminal sessions, these changes won't propagate to:
- GUI applications launched from Finder/Dock
- Services started via launchd
- Cron jobs or other system daemons
Since macOS 10.10 (Yosemite), the recommended approach is to create a plist file that gets loaded by launchd:
sudo nano /Library/LaunchDaemons/path.plist
Then add this configuration (adjust paths as needed):
Label
com.user.path
ProgramArguments
/bin/launchctl
setenv
PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/your/custom/path
RunAtLoad
While still functional on older systems, /etc/launchd.conf
was deprecated after macOS 10.10. If you must use it:
# /etc/launchd.conf
setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/your/custom/path
Important: This won't work for SIP-protected system paths on modern macOS.
To verify your changes:
# For terminal sessions:
echo $PATH
# For GUI apps:
osascript -e 'tell application "Terminal" to do script "echo $PATH"'
Common issues include:
- Permission problems with
/Library/LaunchDaemons
- Path ordering conflicts
- SIP restrictions on system directories
1. Always maintain system default paths (/usr/bin:/bin:/usr/sbin:/sbin
) in your PATH
2. Place custom paths before system paths when you want to override system tools
3. For single-user systems, consider ~/Library/LaunchAgents
instead of system-wide changes
Setting environment variables on macOS that persist across both terminal sessions and GUI applications requires special handling. The traditional approach of modifying shell configuration files (~/.bash_profile
, ~/.zshrc
, etc.) only affects terminal sessions, leaving GUI apps with the default PATH.
Since macOS 10.10 Yosemite, the recommended method uses launchd configuration:
# Create or edit the launchd configuration
sudo nano /etc/paths.d/custom_path
Add your custom paths, one per line:
/usr/local/bin
/opt/homebrew/bin
~/my_apps/bin
For system-wide settings affecting all users:
sudo nano /Library/LaunchAgents/environment.plist
Add this content (adjust paths as needed):
<?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>environment</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>setenv</string>
<string>PATH</string>
<string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/homebrew/bin</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
After making changes, either reboot or run:
launchctl load /Library/LaunchAgents/environment.plist
To verify GUI applications receive the PATH:
osascript -e 'do shell script "echo $PATH"'
When modifying system-wide PATH variables:
- Always place trusted directories first
- Avoid including user home directories in system-wide PATH
- Use absolute paths only
For dynamic PATH handling that works across environments:
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
export PATH="/custom/path:$PATH"