Mac OS X: conventional places where binary files should live

65

22

I've downloaded an application that is a command-line application, and want to put it somewhere where I can run it from the command-line without having to type the path explicitly.

  1. What are the conventional paths used for something like this? /usr/bin? Are there different options, one if I want it for all users, and one if I want it for just a particular user, like my administrator account?

  2. Or should I put it in its own directory under the Applications directory, and add it to the path? If so, which file controls where the path is set?

Jason S

Posted 2009-07-17T14:44:39.790

Reputation: 5 983

Answers

53

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.

Telemachus

Posted 2009-07-17T14:44:39.790

Reputation: 5 695

1On my freshly installed OsX 10.13.6 (High Sierra), the path does contain /usr/local/bin first (even though the folder doesn't even exist) by default. – Legolas – 2018-11-30T15:15:06.657

1@Legolas Apple appears to have changed how they handle this. I'll edit the post. – Telemachus – 2018-12-01T15:21:46.897

9

/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...

avstrallen

Posted 2009-07-17T14:44:39.790

Reputation: 520

1/usr/local/bin is already in a default OS X $PATH (though too late - see my answer). If you use MacPorts, its installer should edit your path as necessary - at least it always has in my experience. That said, it's good for users to know what it's doing (and why). – Telemachus – 2009-07-17T15:13:03.500

well spotted @Telemachus: whenever I build a Mac for myself, I customise the hell out of the path first thing, so I can never remember what's standard and what's mine! – avstrallen – 2009-07-17T15:15:37.413

1I know what you're daying about the MacPorts installer customising the paths in .profile, but I have had an occasion in the past when for some reason, I know not what, this failed to stick (which confused the hell out of me for quite a while!)... so since then I tend to wire it in by hand... – avstrallen – 2009-07-17T15:18:05.440

"which is hidden, so the CLI is the best way to to do this": dumb question, how do you run TextEdit on a file from the command prompt? – Jason S – 2009-07-17T15:32:32.073

No such thing as a dumb question: use the open command with the filename as an argument and it should open with whatever is set as the default text editor (TextEdit as standard). – avstrallen – 2009-07-17T15:42:57.577

@Adamvs: you were right to mention what MacPorts needs in the $PATH since the installer may fail (or something might bork your profile later). I was just mentioning that the installer should add the required info to the path. As I recall, there's even a dialogue now asking "Do you want me to edit your profile so that blah blah." But I may be thinking of Fink there. – Telemachus – 2009-07-17T15:50:40.710

To clarify: at the CLI, do open ~/.bashrc and this will open the file if it's there, or create it if it isn't. To edit the system wide config do sudo open /etc/bashrc and supply the password. Hope you get it sorted... – avstrallen – 2009-07-17T15:51:45.843

Oops, sorry, it won't create the file if it's not there... if you need to create it do touch ~/.bashrc to make the file first. – avstrallen – 2009-07-17T15:53:04.683

@Telemachus - that was the weird thing about my MacPorts install problem - it amended the .profile file just fine, but the system didn't pick it up. That's why it took me so long to beat down the problem: The MacPorts installer seemed to have worked properly, like it had for me every time before. It's still a mystery to me now..! If anyone knows why this might have happened, I'd love to hear about it. – avstrallen – 2009-07-17T15:58:12.380

7

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.⁢

John Topley

Posted 2009-07-17T14:44:39.790

Reputation: 1 558

Yep, it's pretty much the same as other *nix operating systems in that regard. – jtbandes – 2009-07-24T17:29:25.197

2Please quote the essential parts of the answer from the reference link(s), as the answer can become invalid if the linked page(s) change. – DavidPostill – 2016-11-15T11:53:04.143