How do I add a directory to the $PATH in Ubuntu and make the changes permanent?
- 35,092
- 41
- 129
- 192
- 10,850
- 5
- 21
- 19
-
5https://help.ubuntu.com/community/EnvironmentVariables There is all you need to know. I found out that a lot of the input here was incorrect or at least the method was not suggested. This is a great piece of information that will let you figure out where to modify your environment variable based on the reason you are doing it and exactly how to do it without screwing everything up (like I did following some of the aforementioned bad advice). So long, and thanks for all the fish! – Bus42 Jun 12 '16 at 20:30
17 Answers
Using ~/.profile to set $PATH
A path set in .bash_profile will only be set in a bash login shell (bash -l).
If you put your path in .profile it will be available to your complete desktop session. That means even metacity will use it.
For example ~/.profile:
if [ -d "$HOME/bin" ] ; then
PATH="$PATH:$HOME/bin"
fi
Btw, you can check the PATH variable of a process by looking at its environment in /proc/[pid]/environ (replace [pid] with the number from ps axf). E.g. use grep -z "^PATH" /proc/[pid]/environ
Note:
bash as a login shell doesn't parse .profile if either .bash_profile or .bash_login exists. From man bash :
it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.
See the answers below for information about .pam_environment, or .bashrc for interactive non-login shells, or set the value globally for all users by putting a script into /etc/profile.d/ or use /etc/X11/Xsession.d/ to affect the display managers session.
-
5Cool, that worked. I saw where it will auto add the bin dir if I make it so I just used that instead of scripts. TY. – justingrif Jul 22 '09 at 22:13
-
8On Xbunutu .profile isn't be executed so I put it in .bashrc and it works. – tekumara Aug 25 '12 at 22:21
-
16This piece of documentation is very well done: [Official documentation about environment variable](http://help.ubuntu.com/community/EnvironmentVariables#Persistent_environment_variables). Consider reading it (not to say that is updated to the last version of the rules to add values to environment variable). – Michele May 23 '13 at 13:38
-
If you were thinking of using spaces in the PATH statement like: PATH = "... you're in for a treat: Bash will fail to parse it and just respond that PATH isn't a command. – Chris Moschini May 02 '14 at 17:20
-
@LiveWireBT: Could you drop into the [AU general chat](http://chat.stackexchange.com/rooms/201/ask-ubuntu-general-room) and discuss where you got the info from your edit March 7??? – Fabby Aug 21 '15 at 22:15
-
3
-
-
4I've still got no idea where to add my extra path part to. I need to add the android SDK to my path... `PATH="$HOME/bin:$PATH"` So I add it to it? – Jamie Hutber Apr 25 '16 at 14:37
-
4Keep in mind .profile is used on login and thus you have to logout-login again for it to be used (closing and reopening the terminal is not enough). @JamieHutber the path is `$WHERE_YOU_INSTALLED_THE_SDK/platform-tools` and `$WHERE_YOU_INSTALLED_THE_SDK/tools` – Daniele Segato Sep 01 '16 at 08:36
-
-
-
On Elementary OS (based on Ubuntu 18.04), `.profile` wasn't being executed. So, I had to put this in `.bashrc`. – Qumber Aug 03 '20 at 05:32
-
2Sorry for non-constructive comment but... has anyone an explanation why they had to make it so complicated? – Display Name Oct 23 '20 at 17:20
-
@Display Name I can relate to that sentiment. I get having system-wide PATH entries as distinct to those available to a given user account., e.g /etc files like profile, bashrc, etc. It's good to be able to add a new PATH entry for the duration of a terminal session: otherwise entries made for packages later discarded will clog it up. But having to set a new entry each time you use a package is also a nuisance. Hence the need for permanent additons to PATH. For a fuller explanation, read https://www.baeldung.com/linux/bashrc-vs-bash-profile-vs-profile This says nothing about other shells ! – Trunk Mar 11 '23 at 22:03
Edit .bashrc in your home directory and add the following line:
export PATH="/path/to/dir:$PATH"
You will need to source your .bashrc or logout/login (or restart the terminal) for the changes to take effect. To source your .bashrc, simply type
$ source ~/.bashrc
-
4How do you "source your `.bashrc`"? How do you "restart the terminal"? – isomorphismes Sep 10 '11 at 01:16
-
6
-
1I was making the assumption that you were in your home directory. since that's where the .bashrc you want to edit is. – Ophidian Feb 16 '12 at 14:23
-
32`.bashrc` is not the right place for setting environment variables. They should go in `.profile` or `.pam_environment`. See http://mywiki.wooledge.org/DotFiles – geirha Mar 02 '12 at 12:21
-
4@LaoTzu `. .bashrc` not `.bashrc` :) or `source .bashrc` for that matter – Markus Hedlund Aug 21 '12 at 08:26
-
-
What if $PATH is used before path: `export PATH="$PATH:/path/to/dir"`? – MagePsycho Sep 09 '18 at 09:45
-
Before or after is fine, but if you add it to the end then it will have no effect for any executables with naming collisions. Your copy of an executable will get ignored in favour of one found earlier in the list of directories that make up the PATH. – Ophidian Sep 14 '18 at 14:52
-
Don't forget that ":$PATH" at the end, or you'll have to log into a tty (by using ctrl+alt+F2) and edit it in using /usr/bin/nano .profile Happened to me! – Daniel V Feb 02 '21 at 00:10
-
Tried this but messed all commands from terminal. Whenever trying cd or ls or whatever, it said this was not available and that they could either be invoked with /bin/ls OR added to the PATH. Maybe I misunderstood this solution but to fix this I just undid changed to .bashrc file and restarted pc – José Ripoll Nov 02 '22 at 17:52
The recommended place to define permanent, system-wide environment variables applying to all users is in:
/etc/environment
(which is where the default PATH is defined)
This will work in desktop or console, gnome-terminal or TTY, rain or shine ;)
To edit, open the terminal and type:
sudoedit /etc/environment(or open the file using
sudoin your favorite text editor)
To make it work without rebooting, run . /etc/environment or source /etc/environment. Since this file is just a simple script it will run and assign the new path to the PATH environment variable. To check run env and see the PATH value in the listing.
Related:
-
12
-
3This is exactly what I needed. Provisioning a throw-away vm image via vagrant and needed to add node and npm to the path. – Austin Pray Jun 30 '14 at 03:07
-
12To take changes in effect run . /etc/environement (yes, dot, a space and /etc/environment). Since this file is just a simple script it will run and assign the new path to the PATH environment variable. To check run env and see the PATH value in the listing. – WindRider May 20 '15 at 13:27
-
3
-
2@JohnnyAW: source is equivalent to the initial dot, see for example https://en.wikipedia.org/wiki/Source_(command). – Roland Sarrazin Jan 11 '19 at 15:13
-
1
-
From the linked documentation _"It is not a script file, but rather consists of assignment expressions, one per line. ... Note: Variable expansion does not work in /etc/environment. "_, so it isn't a script and you can't use the variable itself as in `PATH=$PATH:/path`. – PhoneixS Mar 27 '20 at 09:57
-
should be the accepted answer, as far as I can tell other ways to set the path, through dot files like `/home/you/.profile` have down-sides. – Milimetric Jun 03 '21 at 20:51
-
Given a /path/to/directory I want to add, is there then a command I can execute to add that, instead of manually editing the file? – Rasmus Sep 16 '22 at 10:10
-
I think the canonical way in Ubuntu is:
create a new file under
/etc/profile.d/sudo vi /etc/profile.d/SCRIPT_NAME.shadd there:
export PATH="$PATH:YOUR_PATH_WITHOUT_TRAILING_SLASH"and give it execute permission
sudo chmod a+x /etc/profile.d/SCRIPT_NAME.sh
- 957
- 2
- 11
- 24
- 797
- 5
- 5
-
29It is usually safer to add your custom path to the end of PATH instead of the beginning. This avoids accidentally replacing system commands with your programs (or someone else's malicious programs). This also avoids a lot of confusion when someone else works on your system (or gives you advice) and they get unexpected results from commands you have "replaced". – Joe Feb 07 '13 at 16:37
For complete newbies (like I am) who are more comfortable with GUI:
- Open your
$HOMEfolder. - Go to View → Show Hidden Files or press Ctrl + H.
- Right click on
.profileand click on Open With Text Editor. - Scroll to the bottom and add
PATH="$PATH:/my/path/foo". - Save.
- Log out and log back in to apply changes (let Ubuntu actually load
.profile).
-
5Editing the .profile file is not recommended anymore.You can still use this method to edit the file .pam_environment see: https://help.ubuntu.com/community/EnvironmentVariables – PulsarBlow May 19 '13 at 04:20
-
Thank @PulsarBlow! I'm not really sure what's exactly the difference and the benefit though... This is the direct URL to the relevant section: https://help.ubuntu.com/community/EnvironmentVariables#Session-wide_environment_variables – dain May 20 '13 at 12:22
-
3This answer caused my system to stop logging in due to all paths being overridden. Using Ubuntu 16.04. – Frisbetarian-Support Palestine Mar 02 '17 at 11:27
-
4@Frisbetarian you have to make sure to add the `$PATH:` bit which includes the existing PATH definition – dain Mar 10 '17 at 05:07
-
-
2home folder means not the one named home, but the one you go into when you type "cd ~" in terminal – Aseem Mar 26 '19 at 07:13
For persistent environment variables available to particular users only. I highly recommend Ubuntu official documentation.
https://help.ubuntu.com/community/EnvironmentVariables
Referring to documentation above, I have setup my Android SDK path-tools by:
- creating
~/.pam_environmentfile in home directory. - the content of which is
PATH DEFAULT=${PATH}:~/android-sdk-linux/tools. - additional custom user path can be added by separating paths with colon (:).
- this requires re-login, which means you need to log-out and log-in back to desktop environment.
- 631
- 5
- 5
Put that line in your ~/.bashrc file.
It gets sourced whenever you open a terminal
EDIT: Based on the comments below, for a more general setting that will apply to all shells (including when you hit Alt-F2 in Unity), add the line to your ~/.profile file. Probably shouldn't do both however, as the path will be added twice to your PATH environment if you open a terminal.
- 9,736
- 9
- 58
- 97
- 3,513
- 20
- 25
-
2Actually, I thought you set the path in either `$HOME/.profile` for personal settings, or `/etc/profile` for all users. But if it's only needed for bash, I suppose either will work. – Marty Fried Jul 31 '12 at 01:37
-
That's only for login shells. EDIT:Doh... I guess the system will source it when you login in to the computer. I always thought of it like a remote login thing. – Ian B. Jul 31 '12 at 01:57
-
2If you set it in `~/.bashrc`, it'll only be available in the terminals you open. E.g. if you hit Alt+F2 and try to run a command from that dir, it won't find it. If you set it in `~/.profile` or `~/.pam_environment`, the gnome session (or whichever DE you use) will inherit it. Appending PATH in `~/.bashrc` also has the drawback that if you open/exec bash interactively from another interactive bash shell, it'll be appended multiple times. – geirha Jul 31 '12 at 04:58
-
3I haven't really looked into this for a while, so I did a search, and it seems that there are at least 95 different ways to set the path, most of which are discussed [here](http://askubuntu.com/q/60218/39753). I never figured out which one is best. I think `~/.profile` is correct for personal paths, though; that's where Ubuntu adds the `~/bin` directory. And I confess that I exaggerated a slight bit on the number of ways - just a little. – Marty Fried Jul 31 '12 at 05:02
-
2@MartyFried, yes, to quote the bot in #bash on freenode: «The overwhelming majority of bash scripts, code, tutorials, and guides on the Internet are crap. Sturgeon was an optimist.» Using google for bash problem, you'll often find a lot of half-working solutions before you find a good one. Oh and I'd go with `~/.profile` in this case too. – geirha Jul 31 '12 at 05:14
-
3@geirha - I agree that most guides on the internet in general are probably crap, especially anything linux since different distros, or even different versions of the same one, do things differently. It usually boils down to what works, but most people don't realize that what works is simply what works, not necessarily what's right or even what will always work. I try to figure out which of the many ways is actually correct, because I hate doing things more than once - but it's not always easy. :) – Marty Fried Jul 31 '12 at 18:50
Adding it to .bashrc will work but I think the more traditional way of setting up your path variables is in .bash_profile by adding the following lines.
PATH=$PATH:/my/path/foo
export PATH
According to this thread it appears as though Ubuntu's behavior is slightly different than RedHat and clones.
- 883
- 1
- 8
- 13
-
1
-
7If you have `.bashrc`, stick it in `.bashrc` instead. GUI terminals in Ubuntu are not login shells, so `.bash_profile` will not be run. – Jul 22 '09 at 21:58
-
1I am not running a gui shell. But from the thread above it looks like the .bashrc will work just fine. – justingrif Jul 22 '09 at 22:05
-
2Both will work if your shell is a login shell. But I just tried the .bash_profile approach on one of my Ubuntu machines and even after restarting my gnome session it didn't source my .bash_profile. So I would say that putting this in .bashrc is probably the way to go with Ubuntu. – 3dinfluence Jul 23 '09 at 02:30
-
3@justingrif No, you don't need `.bash_profile`. If bash doesn't find a `.bash_profile` (when you log in interactively), it will look for `.profile` and use that instead. By default, you'll have a `.profile` and `.bashrc` in Ubuntu. And `.profile` is the correct place to set environment variables if we disregard pam_env. – geirha Mar 02 '12 at 12:19
To set it system wide, append the line export PATH=/path/you're/adding:$PATH to the end of /etc/profile.
To add the directory for only the logged-in user, append the same line to ~/.bash_profile.
- 1,766
- 2
- 19
- 30
- 271
- 1
- 3
In terminal, cd to the_directory_you_want_to_add_in_the_path
echo "export PATH=$(pwd):\${PATH}" >> ~/.bashrc
This wasn't my idea. I found this way to export path at this blog here.
- 121
- 1
- 2
sudo vi /etc/profile.d/SCRIPT_NAME.sh
add there
export PATH=YOUR_PATH_WITHOUT_TRAILING_SLASH:$PATH
- 70,934
- 124
- 466
- 653
-
2`sudo nano /etc/profile.d/SCRIPT_NAME.sh` is easier for beginners. – isomorphismes Sep 10 '11 at 01:22
-
1For beginners, `gksu gedit /etc/profile.d/SCRIPT_NAME.sh` is even easier. – fouric Mar 26 '13 at 00:04
The recommended way to edit your PATH is from /etc/environment file
Example output of /etc/environment:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
For example, to add the new path of /home/username/mydir
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/username/mydir"
Then, reboot your PC.
System-wide environment variables
A suitable file for environment variable settings that affect the system as a whole (rather than just a particular user) is /etc/environment. An alternative is to create a file for the purpose in the /etc/profile.d directory.
/etc/environment
This file is specifically meant for system-wide environment variable settings. It is not a script file, but rather consists of assignment expressions, one per line.
Note: Variable expansion does not work in /etc/environment.
More info can be found here: EnvironmentVariables
-
3The lowest answer yet the most correct. This file is usually auto-populated bin Ubuntu with the path. – NotoriousPyro Oct 12 '17 at 13:33
-
Whenever I "install" my folder of BASH scripts, I follow the pattern of the test for a $HOME/bin folder that's in most .profile files in recent versions of Ubuntu. I set a test that looks like
if [ -d "/usr/scripts" ]; then
PATH="/usr/scripts:$PATH"
fi
It works just about 100% of the time, and leaves me free to change it in a GUI text editor with a quick "Replace all" should I ever decide to move /scripts somewhere closer to my $HOME folder. I haven't done so in 6 Ubuntu installs, but there's "always tomorrow." S
BZT
- 463
- 2
- 9
- 26
- 71
- 1
- 1
Open your terminal, type gedit .profile and insert the following:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$PATH:$HOME/bin"
fi
#the following line add Bin where you dont have a Bin folder on your $HOME
PATH="$PATH:/home/mongo/Documents/mongodb-linux-i686-2.2.2/bin"
Close and open terminal, it should be working.
- 53,609
- 102
- 137
- 162
- 51
- 1
- 1
Even if system scripts do not use this,
in any of the cases that one wants to add a path (e.g., $HOME/bin) to the PATH environment variable, one should use
PATH="${PATH:+${PATH}:}$HOME/bin"
for appending (instead of PATH="$PATH:$HOME/bin"),
and
PATH="$HOME/bin${PATH:+:${PATH}}"
for prepending (instead of PATH="$HOME/bin:$PATH").
This avoids the spurious leading/trailing colon when $PATH is initially empty, which can have undesired effects.
- 14,146
- 10
- 41
- 89
For Ubuntu edit the ~/.bashrc and add the following line.
. ~/.bash_profile
Then edit your .bash_profile as you need.....
- 70,934
- 124
- 466
- 653
-
1Downvoted because you didn't explain how to "edit your `.bash_profile` as you need". What exactly do I need to do to the `.bash_profile`? – isomorphismes Sep 10 '11 at 01:17
-
4This is the wrong way. `.profile` or `.bash_profile` should source `.bashrc`. Not the other way around. – geirha Mar 02 '12 at 12:15