Where does $PATH get set in OS X 10.6 Snow Leopard?
Solution 1
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
.
Solution 2
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 /etc/paths/opt/local/bin
and reopen the terminal window.
Solution 3
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.
Solution 4
To show your path, echo $PATH.
echo $PATH
To set your path, edit ~/.bash_profile
, not ~/.bash_login
.
Solution 5
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.
Related videos on Youtube
Andrew
Updated on September 17, 2022Comments
-
Andrew over 1 year
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-
100rabh over 12 yearscomment 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.
-
Keep Coding over 11 years@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. -
Pedro Lopes about 8 yearsI have made a script mostly based on this post, that quickly prints out where the PATH is defined along these multiple locations: gist.github.com/lopespm/6407349952bc8a1ff8fb
-
-
Arjan over 13 yearsApparently,
~/.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. -
tomlogic over 12 years+1 for
~/.cshrc
. Went nuts trying to figure out why~/.profile
wasn't working. -
Tommy over 7 yearsI think this answer is incomplete. I am trying to figure out where an erroneous (non-existent) path: /usr/bin/local, my shell is complaining about, and it is not in any of those files.
-
Devs love ZenUML almost 6 yearsI think
.bashrc
is read regardless if you typebash
or not.