How to add to bash $PATH permanently on Linux

Posted on in Categories , , , , , last updated November 17, 2016

I am a new Linux and bash shell user. How do I permanently set $PATH on Linux? How can I permanently add a directory to shell PATH on Linux?

You need to setup a variable called PATH. The search path for commands defined by $PATH shell variable. It is nothing but a colon-separated list of directories in which the shell looks for commands. The default path is system-dependent, and is set by the sysadmin who installs bash or operating system for you.

See current PATH settings

Type the following command:

echo $PATH
## OR ##
printf "%s\n", $PATH

Sample outputs:

/home/vivek/perl5/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

How to correctly add a path to PATH?

The syntax is:

PATH=$PATH:/new/dir1/here
PATH=$PATH:/new/dir1/here:PATH=$PATH:/new/dir2/here/

OR

PATH=/new/dir1/here:$PATH
PATH=/new/dir1/here:/new/dir2/here/:$PATH

To add $HOME/bin/ directory to path type:

## ~/bin/ to be searched after all other directories ##
PATH=$PATH:$HOME/bin/

OR

## ~/bin/ to be searched before all other directories ##
PATH=$HOME/bin/:$PATH

The first syntax adds $HOME/bin/ at the end PATH. The second syntax adds $HOME/bin/ at the beginning of PATH.

Fig.01: Sample bash shell session
Fig.01: Sample bash shell session

Permanently add a directory to shell PATH

To permanently add shell path edit ~/.profile ~/.bash_profile file:
$ vi ~/.profile
OR
$ vi ~/.bash_profile
Append path setting:

## ~/bin/ to be searched after all other directories ##
export PATH=$PATH:$HOME/bin/

Save and close the file. To reload changes immedialty without logout, enter:
$ source ~/.profile
OR
$ source ~/.bash_profile
Verify it:
$ echo $PATH

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

3 comment

  1. Nice topic. A few things I’d like to add though…
    PATH is used by pretty much all the shells, not just BASH. Also it is highly recommended to hardcode the PATH env in every single script (probably in the beginning).
    While being a very nice place to keep references to all our binaries it might be harmful if not used carefully. Say you got some malware in the system (yes, it happens in Linux too – I’ve learnt it the hard way) which creates some custom scripts and renames them to ‘uptime’, ‘date’ or whatever other usual Linux command and stores them, say, in /tmp/bin/. Then it replaces PATH with “/tmp/bin/${PATH}” and executes any executable using ‘uptime’ internally. And a distracted sysadmin accidentally left a setuid bit enabled on some root-owned script… this means that this malware can easily trigger its script with root permissions because that suid-enabled script uses, say, a command ‘uptime’ which originally resides in /usr/bin, but thanks to modified PATH it has been overriden with /tmp/bin/uptime. Now malware gets a full access to your system to do anything it likes. See this:

    netikras@netikras-xps ~ $ mkdir /tmp/bin
    netikras@netikras-xps ~ $ vim /tmp/bin/uptime
    netikras@netikras-xps ~ $ chmod +x /tmp/bin/uptime 
    netikras@netikras-xps ~ $ PATH="/tmp/bin:${PATH}" which uptime
    /tmp/bin/uptime
    netikras@netikras-xps ~ $ 
    

    Not pretty, is it?

    Similar requirements apply to IFS as well. If one is writing a script one should either always hardcode PATH or always specify use full path to the executables (the former is much more practical). Hardcoded IFS always is a very good idea too.

Comments are closed.