Understanding the $PATH Variable
In this tutorial, we will show you how to permanently set your PATH on Linux.
First off, why should you care?
The $PATH variable, or just PATH, without the $ indicating variables, specifies a list of directories that impacts your computing platform's functionality in a critical way. This is because the $PATH is the list of directories in which the system searches for executable programs, scripts, or files.
Imagine trying to run the
ssh command, for example, to connect to a server. What happens if the system cannot find the
ssh program? You are unable to connect to servers and run computations. You have a plethora of useful programs, examples like
apt-get and so on, that your computer needs to be able to find when you invoke them at the command line.
The $PATH variable is the key that makes it possible to find the correct program and execute it at your command without needing the executable's full directory path. When your PATH is set incorrectly, your shell will be unable to find programs, and certain commands will fail.
Using bash_profile to Set your PATH
A common mistake with the $PATH variable is to set it in the current shell only, without persisting the change. When you open a new shell, the changes are lost, and you are once again unable to execute certain commands because those programs are not found in the PATH.
The first way of setting your $PATH permanently is to modify the $PATH variable in your Bash profile file, located at
For example, let's say I want to add a new directory
/home/tomahawk/tools/jdk1.8.0_92/bin to my PATH. You might recognize this as a Java Development Kit installation. However, that is beside the point. Whatever the directory contains, I can add it to our path and make the programs that this
bin directory contains accessible from the command line by adding the following line to the end of the file
... export PATH="$PATH:/home/tomahawk/tools/jdk1.8.0_92/bin"
A good way to edit the file is to use
emacs. You can use the command
sudo <editor> ~/.bash_profile, and enter your admin password when prompted, then add that line to the end and save the file.
To activate the changes in the current shell, you have to "source" the updated
bash_profile file. You do this with the command:
$ source ~/.bash_profile
This simply imports the file's settings into the current shell. Now every time you open your shell, your
bash_profile will automatically be "sourced" and you won't need to run this command every time.
Now we can invoke commands or programs in the new directory
/home/tomahawk/tools/jdk1.8.0_92/bin, such as
javac, located at
/home/tomahawk/tools/jdk1.8.0_92/bin/javac by just typing at the command prompt the name of the program. We can do this now from any directory, because the PATH has been updated to look for executable programs in our new directory.
$ javac --version
Now runs the correct
javac program, printing out something like the following:
Java Compiler, version 1.8.0_92
bash_profile is appropriate when you want to set a PATH variable customized for a single user of the system. If you wanted to set PATH for all users of a system, there are better ways to do so, which we cover further on in this guide.
Using bashrc to Set your PATH
Instead of setting the PATH in
~/.bash_profile, we can also add the directories we want to the PATH in
~/.bashrc instead. Setting the PATH in
bashrc looks identical to how we set it in
For example, to include the directory
/home/tomahawk/.rbenv/bin in my path, I edit or create the file
/home/tomahawk/.bashrc, adding the following line:
... export PATH="$PATH:/home/tomahawk/.rbenv/bin"
Notice that, like last time, the first thing in our new PATH export is the inclusion of the existing $PATH variable. This ensures that we preserve the current value of PATH, and just add any additional directories on to the PATH, after the $PATH variable. If you do not do this, you will overwrite the PATH variable entirely, and miss critical directories the system needs to be on the PATH. As a result, your system can become unusable.
The difference between using
bash_profile is that
bash_profile is used for login shells. These run when you login via the console, or log in using
ssh. In contrast, once you are logged in, and you open a command shell or run the
bash command, the
bashrc file will run. Your PATH settings from
bashrc will then be available.
The effect of setting the PATH is similar. In addition, we must activate any changes in the
bashrc file into the current shell the first time we make this change, just as we did for the
bash_profile file. This time, we run
source ~/.bashrc. We can now access the new PATH at the command line. It has been set permanently and will stay the same between multiple logins into the system.
Using a Profile File to Set your PATH
We can also set the PATH permanently using a user's profile file. This is different from
~/.bash_profile in that it is set not for shells only, but for all programs.
User profiles are loaded at login. The PATH variable can be set in the
To set my PATH to include everything already in $PATH, as well as a new directory
/home/tomahawk/.exenv/bin, I edit the file at
~/.profile and set the PATH as follows
As in all prior examples, we will need to source these changes to make them active for the current shell, but subsequent logins will persist the changes.
Once that's done, I can run the
exenv command, which is one of the programs available in the folder I just added to the PATH, and I get back the output of my exenv version:
$ exenv version 1.3.4 (set by /home/tomahawk/.exenv/version)
You can read more about the exenv program here, but you can use this process to set PATH permanently to include any program or directory you want.
Permanently Setting your PATH for Other Shells like ZSH and KSH
If you use alternative shells such as zsh, ksh and others, you can set the PATH permanently using those shells' configuration.
You can therefore set the PATH permanently for these shells in a similar way to what we did for Bash. For zsh, you can find these files, or create them if they do not exist, at
Similarly, you can set PATH permanently for ksh in the configuration files located at
Permanently Setting System-Wide PATH for all Users
System-wide settings for all users can be set in
/etc/profile. There is considerable flexibility and multiple options for setting the PATH permanently system-wide.
Your Linux system will execute all script files ending in .sh in
/etc/profile.d whenever a bash shell is entered, as well as when the desktop session loads.
You can therefore add a new file, such as
env.sh inside the directory
/etc/profile.d. In this file, we can export the PATH variable, setting it permanently to our choice of path directories, for example:
Files in /etc/profile.d are sourced by /etc/profile, thus activating our system-wide PATH whenever a user logs in.
We can also set PATH for all users in
/etc/environment, which takes key-value pairs of the form:
Troubleshooting PATH Problems
As we saw, setting the PATH permanently in Linux has many options. You can set the PATH for only a certain user, for all users, or for only certain types of command shells. However, it's a good idea to not fiddle with system-wide PATH settings unless you really know what you are doing.
If you encounter problems, a good starting point is to find out the current value of $PATH, by running the command:
$ echo $PATH
For more troubleshooting tips, check out this resource.