Mac OS X: conventional places where binary files should live

Core answer: you probably want /usr/local/bin. Depending on how recent your macOS is, you may need to update your default $PATH. See below for further details.

UPDATE 12-01-2018 At some point since I wrote my original answer, Apple changed its default $PATH. As a result, a lot of what I say below is irrelevant to recent Macs. If you type echo $PATH in a terminal, and /usr/local/bin is first, then you can ignore everything below about changing your $PATH.

Original answer

Macs are unusual in this regard. The default $PATH variable for a regular user looks like this:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

By putting /usr/local/bin after /usr/bin and /bin, Mac upends the usual system. Normally, you can put something into /usr/local/bin (say a second Perl interpreter, compiled in some non-standard way), and then a regular user will hit the custom one rather than the system-wide one first. This is good. Users can get variants, but the system stays pure. Given Apple’s default $PATH, however, items in /usr/bin or /bin will get found before anything in /usr/local/bin. (This basically defeats the purpose of installing, e.g., the custom Perl in /usr/local/bin.)

To fix this, you can change the regular user's $PATH by editing the .profile file in the user's home directory. (That file may not exist, if you have a brand-new install. In that case, create it.)

Semi-related: Homebrew provides excellent package management for Macs. By default, Homebrew installs software into /usr/local, but it does so in a way that makes it very easy to remove things and return to a vanilla state later.


/usr/local/bin and /usr/local/sbin are well worth adding to your path, as a lot of makefiles for source builds are defaulted to install there.

If you use MacPorts, it's worth adding /opt/local/bin and /opt/local/sbin as well.

The best way to do this is to add

export PATH=/usr/local/bin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin:$PATH

to the .bashrc file in your home directory (which is hidden, so the CLI is the best way to to do this), or, if you want to change the system wide path, add the same line to /etc/bashrc (not hidden), but you will need to sudo to do this.

If you don't have a .bashrc in any user's home, you can make one and add this line to it, but remember to change the permissions on the file you create to make it readable by the user in question (obviously not relevant if you're doing it for your own profile).

The $PATH at the end appends the system default path to whatever you put before. Note that the system searches for binaries in the order of paths given, so if you install a binary in /usr/local or /opt/local that is also installed by default on the system, the versions you install will be found first, which can (though rarely) upset things. It is worth watching out for.

Good information is here.

I should note that the above assumes you are using Bash for the shell, which is the default on Mac OS X v10.4 (Tiger) and Mac OS X v10.5 (Leopard), but not on earlier systems, which used tcsh instead, which has a different syntax.

I hope that helps...


I tend to go with /usr/local. Here's a nice explanation why, which refers to Filesystem Hierarchy Standard (FHS).⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢, which in turn says about /usr/local:

Tertiary hierarchy for local data, specific to this host. Typically has further subdirectories, e.g., bin, lib, share.⁢