81

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?

1
  • 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?). Mar 7, 2021 at 4:31

5 Answers 5

102

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.

11
  • 8
    No need to execute another shell. source is the correct way
    – Matteo
    Dec 13, 2011 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, 2011 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, 2011 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, 2011 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, 2011 at 2:27
23

Just use

source ~/.bashrc

or

. ~/.bashrc
1
  • 1
    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, 2021 at 0:57
5

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>.

1
  • 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, 2020 at 7:48
3

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.

2
  • Could you change the "another answer" into a link to that answer? ;)
    – AdminBee
    Jan 28, 2020 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, 2020 at 7:50
3

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.