I frequently edited the .bashrc file to export new environment variables.

Rather than close the console and start a new one to refresh the env variables, is there a convenient way to refresh?

  • I just want to mention that environment variables should be set in your .profile, not .bashrc. The .profile is sourced when you login (e.g. via a display manager) and also takes effect for programs that aren't started from your shell (e.g. via your desktop environment). This makes it, AFAICT, basically impossible to modify it without logging out though. Then only solution to change the environment after login I'm aware of is the fish shell with their universal variables. This shell is not well supported in display managers though (yet?). – Paul Schyska Mar 7 at 4:31

Within the same window, you can simply type bash to start a new one. This is equivalent to closing the window and re-opening a new one.

Alternatively, you can type source ~/.bashrc to source the .bashrc file.

  • 8
    No need to execute another shell. source is the correct way – Matteo Dec 13 '11 at 6:18
  • 3
    also there is no need to type long word source. you can just type dot instead of it: . ~/.bashrc. – rush Dec 13 '11 at 6:31
  • 4
    @Rush typing source shows the user which command is called. I don't believe in showing the shorthanded commands to new users until they understand what the code is doing. – n0pe Dec 13 '11 at 6:34
  • 13
    note that merely sourcing bashrc is not necessarily equal to a restart of bash. defined variables are not automatically undefined. shell options are not automatically unset. sourcing bashrc only executes what is written in bashrc. it does not rollback any other changes in the environment. starting a new bash session inside the old is also not necessarily equal to a restart of bash, as the new process inherits the environment from the old. – lesmana Dec 13 '11 at 20:57
  • 4
    @MaxMackie Considering how source is a bashism that is longer to type yet offers no advantages over its portable across all shells equivalent, ., I don't see the point of encouraging anyone, new or experienced, to use it. – jw013 Dec 15 '11 at 2:27

Just use

source ~/.bashrc


. ~/.bashrc
  • this is not right, as the objects you may already have defined in your session but that are not redefined in the bashrc file (or unset) will stay defined – Jules G.M. May 25 at 0:57

In addition to what others have suggested, I have found out that source won't unset the previously assigned environment variables. So, if you want to unset environment variables, you have to do it manually using unset <var>.

  • Great idea! But this exposes what I hate the most about Linux mindset. They make tools to do a half-assed job and then someone has to come around and clean up the mess. Mutating the state of your system is NOT FUNDAMENTAL. Refreshing an environment by starting from a known good state is a fundamental concept in computer science and yet the UNIX developer mindset chooses to ignore this. The state of the system needs to be a guarantee! Not just merely an afterthought. – Ryan Jul 3 '20 at 7:48

Adding to another answer, I find it's helpful to define the following alias:

alias refreshenv="bash;exit"

Doing this will ensure that the parent bash instance will be killed as soon as you exit the child bash instance and so on. Avoids you having to type exit multiple times, as you'd have to do with just typing bash.

  • Could you change the "another answer" into a link to that answer? ;) – AdminBee Jan 28 '20 at 12:14
  • Interesting hack. Definitely a workable equivalent. It's what you do anyway, closing terminal and opening it back up. – Ryan Jul 3 '20 at 7:50

Since this question comes up on Google when you search for how to reload the environment inside a shell script, here's one:

If you're inside a Bash script and need to re-load environment variables afresh:

Spawn a login shell with an empty environment and then examine its state:

eval "$(exec /usr/bin/env -i "${SHELL}" -l -c "export")"

Note that this will not consider non-exported variables. I would suggest set -o posix && set for that instead, but it has the problem that it can break, as you can't just write every variable in Bash. Parsing its output is not easy either, so I wouldn't recommend it. It's unlikely it's what you want though.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.