Adding a directory to $PATH in CentOS?
Solution 1:
It's not a good idea to edit /etc/profile
for things like this, because you'll lose all your changes whenever CentOS publishes an update for this file. This is exactly what /etc/profile.d
is for:
echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
chmod +x /etc/profile.d/ree.sh
Log back in and enjoy your (safely) updated $PATH
:
echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
which ruby
/usr/lib/ruby-enterprise/bin/ruby
Instead of logging back in, you could reload the profile:
. /etc/profile
This will update the $PATH
variable.
Solution 2:
After following fmonk's advice I checked out /etc/bashrc
, where I noticed it said that "Environment stuff goes in /etc/profile." I proceeded to look in /etc/profile
, I saw this:
pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
fi
}
[...]
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi
To solve my problem, I simply added pathmunge /usr/lib/ruby-enterprise/bin
underneath the if statement. This solved my issue.
Solution 3:
"An interactive login shell is started after a successful login, using /bin/login, by reading the /etc/passwd file. This shell invocation normally reads /etc/profile and its private equivalent ~/.bash_profile upon startup.
An interactive non-login shell is normally started at the command-line using a shell program (e.g., [prompt]$/bin/bash) or by the /bin/su command. An interactive non-login shell is also started with a terminal program such as xterm or konsole from within a graphical environment. This type of shell invocation normally copies the parent environment and then reads the user's ~/.bashrc file for additional startup configuration instructions." http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html
Therefore I would not put environment variables in bashrc, because it is not only against common convention, but you will also miss your bashrc varialbles when invoking a terminal from a graphical Desktop environment.
On Redhat in the /etc/profile
I found this comment:
"System wide aliases and functions should go in /etc/bashrc. Personal environment variables and startup programs should go into ~/.bash_profile. Personal aliases and functions should go into ~/.bashrc."
So if you want to set environment variables on a user basis, do it in the user's .bash_profile file.
Heading over to the .bash_profile
I read:
"Personal environment variables and startup programs.
Personal aliases and functions should go in ~/.bashrc. System wide environment variables and startup programs are in /etc/profile. System wide aliases and functions are in /etc/bashrc."
Conclusion
If you want only root to see programs residing, for instance in /sbin
I would add that path to root's .bash_profile
file. But if you want every user to see what root specific programs are installed on your box I would put /sbin
into /etc/.profile
. Now every user can use tab completion to look for root specific programs and elevate rights if necessary.
Special Case: SSH
When ssh is started with a commandline, an interactive login shell is started. But in this case /etc/profile
is not read. When I defined environment variables in the .bash_profile
file of each user it worked with ssh.
Solution 4:
SORRY misinterpretted the question the following asnwer is for a USER's profile leaving it in case it helps someone
modify .bash_profile
nano ~/.bash_profile
then somewhere in the file add/modify your paths seperated by :
PATH=$PATH:$HOME/bin:/your/path
export PATH
then reload your profile
source ~/.bash_profile
or logout and login again
if you check PATH it should include your newly added paths
echo $PATH