Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I type echo $PATH on the command line and get

/opt/local/bin:/opt/local/sbin:/Users/andrew/bin:/usr/local/bin:/usr/local/mysql/bin:/usr/local/pear/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin

I'm wondering where this is getting set since my .bash_login file is empty.

I'm particularly concerned that, after installing MacPorts, it installed a bunch of junk in /opt. I don't think that directory even exists in a normal Mac OS X install.

Update: Thanks to jtimberman for correcting my echo $PATH statement

share|improve this question
4  
comment from SMcCandlish:easiest solution when you want to make a site-wide path change (e.g. to include /usr/libexec or whatever) is to edit /etc/paths . While the new /etc/paths.d/ thing is functional, it's actually more hassle than maintaining a single file. As others have hinted but not spelled out, if the path changes you want would be useful only for one user, it's best to make that change in the bash and/or tcsh config files in that user's home directory instead of system-wide. –  Sathya Oct 3 '11 at 10:11
    
@Sathya, It seems to me /etc/paths.d is useful for installation scripts. If I want my installation script to add the installed program to the path, I can drop a file in /etc/paths.d. If I want to edit the path manually, /etc/paths is a better option. –  haydenmuhl Dec 6 '12 at 1:04

8 Answers 8

up vote 125 down vote accepted

When bash starts it reads the following files every time you login. For the purposes of OS X, this means every time you open a new Terminal window.

/etc/profile
~/.bash_profile
~/.bash_login   (if .bash_profile does not exist)
~/.profile      (if .bash_login does not exist)

When you start a new shell by typing bash on the command line, it reads .bashrc

OS X also uses ~/.MacOSX/environment.plist to set more environment variables, including paths if necessary.

Finally, /etc/paths and /etc/paths.d are read by the shell too.


/opt/local/bin etc. are added in ~/.tcshrc by MacPorts. Also be sure to look in ~/.cshrc.

share|improve this answer
4  
Apparently, ~/.MacOSX/environment.plist does not work for some people. In Change Path for OS X an alternative by using the folder /etc/paths.d is described. I've not tested that. –  Arjan Dec 18 '10 at 19:35
    
+1 for ~/.cshrc. Went nuts trying to figure out why ~/.profile wasn't working. –  tomlogic Oct 19 '11 at 6:31

Take a look at the file /etc/paths, which is used by /usr/libexec/path_helper, which is used by /etc/profile.

For MacPorts, use sudo to append ``/opt/local/binto the end of the/etc/paths` file and reopen the terminal window.

share|improve this answer
    
Thanks! I didn't know where path_helper was loading paths from. –  nilbus Jan 5 '13 at 16:15
    
This was the cleanest way for me. Thanks! –  Dragan Marjanović Feb 27 '13 at 10:19

Seriously, Leopard gave us a new way to add path. Just create a file containing the path part you want to add, and put it in /etc/paths.d

A quick example of doing this in one step is:

echo "/some/path/to/add" >> /etc/paths.d/somefilename

Otherwise, you can just go to /etc/paths.d and put the file there directly. Either way, any path parts in the files in that directory will be appended to the default path.

This also works for manpath.

Here's a link to more details:

ars technica: how do i add something to PATH in snow leopard?

On a 2nd note: MacPorts puts everything into the opt directory precisely because it isn't used by Apple's stuff. That way it won't conflict. Their guide (excellently written, BTW) has an explanation of why it uses opt and how to change that default if you'd like.

MacPorts Guide

share|improve this answer
    
Very cool. Now we only have to get those path dependent applications to no longer pollute our profile files... –  Daniel Beck Mar 25 '11 at 18:19
    
Love it. Simple! –  Andrew Hedges Apr 4 '11 at 17:07
    
comment from SMcCandlish: I have to concur that there's nothing weird or bad about MacPorts using /opt (likewise Fink uses /sw); trying to replace stock Mac BSD parts with bleeding-edge builds from external projects like these is a recipe for an unusable system that requires an OS reinstallation. –  Sathya Oct 3 '11 at 10:12

To show your path, echo $PATH.

echo $PATH

To set your path, edit ~/.bash_profile, not ~/.bash_login.

share|improve this answer

Actually it is stored in your .profile file instead of .bash_login and it is common that MacPorts will use this instead of the .bash_login file.

Also The /opt directory is usually created by MacPorts and it stores its files in this folder.

share|improve this answer

There's also the path as determined by ssh.

Compare echo $PATH to ssh localhost 'echo $PATH'. Since ssh does not read /etc/profile, /usr/libexec/path_helper doesn't run and thus /etc/paths is skipped. Now try ssh localhost 'source /etc/profile; echo $PATH'. The paths should be closer. The remaining differences will likely be due to path modification in your .bash_profile (which is also skipped by ssh) and .bashrc (which is read by ssh).

If you want your ssh path to be similar to your normal terminal path, you could add source /etc/profile to your .bashrc.

share|improve this answer
    
Thanks for the hint! I was looking exactly for the solution with ssh. svn+ssh could not find svnserve command exactly because path to svnserve was in .profile, but wasn't in .bashrc. –  KIR Jul 4 '13 at 9:01

Regarding docs for /usr/libexec/path_helper utility, initial components for $PATH was taken from /etc/paths and by default looks like

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

for OS-X Snow Leopard

share|improve this answer

It could be defined in either:

  • System variables - /etc/paths
  • User variables - see @Steve Folly's explanation
share|improve this answer

protected by Community Oct 3 '11 at 10:12

Thank you for your interest in this question. Because it has attracted low-quality answers, posting an answer now requires 10 reputation on this site.

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.