Skip to main content

Setting Environment Variables and the PATH on MacOS

Time Was setting environment variables and the PATH on a Mac running OSX was just like any other *IX.  However with successive OS releases Apple have changed how this works (more than once) and generally made it more difficult 😢  This article discusses how I go about setting environment variables on Mojave and Catalina.

Why does this matter?

MacOS doesn't add /usr/local/bin to the PATH by default, which is unfortunate as most *IX-style programs you build yourself will be installed in there.

If you only ever launch stuff from Terminal, all you have to do is set environment variables and the path from Shell startup files in the time immemorial fashion.

However, this doesn't help with native Mac Apps like Emacs, which aren't launched from a shell and where you may still want to access custom environment variables and programs in /usr/local/bin.

Setting the PATH

In the past you could add to the path via /etc/paths (or paths.d), however this no longer works in Mojave or Catalina.

There is the cunning exec-path-from-shell which launches a sub-shell and copies the path and environment variables from the shell into Emacs. That's great if you're just using Emacs, but obviously won't work with anything else.

I prefer a solution which will work for all apps and it is possible to set the path for the current user with the launchctl command:

$ sudo launchctl config user path /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Note that you only have to issue this command once.

Setting Environment Variables

I think the easiest way is to create a plist file in ~/Library/LaunchAgents to invoke launchctl and set environment variables on login, like this:

<?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>my-env-vars</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl setenv BASH_SILENCE_DEPRECATION_WARNING 1
        </string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

Comments

Popular posts from this blog

My Work in new Top Trumps Birds of Prey Pack

The new Top Trumps "Birds of Prey" pack has my picture illustrating the Secretary Bird card 😀 Here's the original picture: From Flickr

On BBC Springwatch !

BBC Springwatch featured one of my Goldfinch pictures last night: Goldfinch on Springwatch Shame they spelt my name wrong though! See the original on Flickr.

Emacs and MacOS Catalina

Catalina introduced a lot of security changes and the most intrusive is probably all the popups asking to give permission for apps to access directories under Home, like Documents. Worse still, apps which weren't written to handle the new security measures might just fail silently with no clues for the user. A solution is to give apps like Emacs "Full Disk Access" under "Security & Privacy" in Preferences, to give unfettered access to your files and avoid all the popups and silent failures. Sounds good, but that doesn't actually work for Emacs because "Emacs" in the app bundle is actually a Ruby script which decides which flavour of Emacs executable to run. This never mattered before, but it does under Catalina because MacOS thinks the executable is /usr/bin/ruby . Conventional wisdom is therefore to give "Full Disk Access" to Ruby. While this does work, I've always been uncomfortable giving all Ruby scripts full access...