Since .bashrc
is more "generic" (in the sense that .profile
sources it), why "include ~/bin
to path" procedure is not inside .bashrc
? Why the user would not want it in a non-login shell? (Especially nowadays, where non-login shells are more common*.)
I know I can manually do such change, but I want to know if there is a reason.
*can't prove it, but I think that is the case.
Best Answer
~/.bashrc
and/etc/bash.bashrc
are run every time an interactivebash
shell is started.In contrast,
~/.profile
and/etc/profile
are run every time any login shell is started. So it does not have to be abash
shell, but it does have to be a login shell (and manybash
shell instances are not login shells).bash
shell is a shell where the shell program that provides it isbash
, rather than some other program, such asdash
.Therefore, putting a commend that appends entries to
PATH
in abashrc
file would:Do nothing when the shell is not
bash
, which is often the case. For example,PATH
would be unmodified when you're in a graphical login session. Remember,PATH
is not just used by command-line programs.Append it over and over again in the presence of nested
bash
shells. So, if you start a shell within a shell--which is very common, for a variety of reasons--then you'll have multiple~/bin
entries stacked onto yourPATH
. This makes thePATH
environment variable difficult to read, and sometimes also decreases performance.These would be undesirable. Thus it would be wrong to put this in a
bashrc
file; it really belongs in~/.profile
.~/.profile
is the right place for:Non-login shells have login shells (or something that behaves like a login shell) as their parent, and inherit most of their environment variables, including
PATH
, from this login shell. So putting path-modifying commands in~/.profile
requires that you log out and back in for them to be effective, but it affects the environment of non-login shells too (as well as the environment for programs that are not shells, since every program gets its own set of environment variables--called its "environment"--inherited from its parent process).