MacOS Big Sur – set env vars for GUI apps

big surenvironment-variablesmacos

I followed many methods on Ask Different as to how to change the $PATH environmental variable for GUI apps. Some of the methods may work for pre-Catalina macOS, some may work for Catalina, but none of them work for me on macOS Big Sur.

So here's the story – I installed go to /usr/local/bin/go with Homebrew, and VS Code cannot find it –

enter image description here

Methods I've tried to solve this issue:

  • sudo launchctl config user path "/usr/local/bin:$PATH", and reboot.
  • Edit /etc/paths so that it includes /usr/local/bin, and reboot.
  • Other launchctl tricks.

So what's the recommended way to set env vars for GUI apps on macOS Big Sur? Any help is appreciated.

Best Answer

The following worked for me to get an environment variable to be accessible from a GUI app (SwiftBar).

I created a plist file (eg; com.example.set-env-vars.plist) in ~/Library/LaunchAgents/ with the following contents:

<?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>setenv.MY_VARS</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv MY_VAR my_value</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
</dict>
</plist>

Then I rebooted for it to take effect. I suspect logging out and logging back in may be adequate, since stuff in ~/Library/LaunchAgents/ should be applied at login.

If anyone can improve this answer, I'd love to know why this works but running launchctl setenv MY_VAR my_value from a terminal does not.

Swap out MY_VAR and my_value as needed. Note, I'm not sure whether this would allow you to do something like launchctl setenv PATH "/usr/local/bin:$PATH", as I'm not sure whether $PATH would exist or expand properly.