How do I reload ZSH config files without replacing the current shell?
Asked Answered
J

6

100

How do I tell ZSH to reload itself, as if it's a freshly invoked shell, but without losing the history?

The context for this is that I've spent a long time building my ZSH setup, and I'd hate to lose it if my current machine fails, or the drive gets corrupted, etc. To this end, I've put all my local ZSH config files in a git repository. Nothing new so far.

But now I want to add an 'install' script to the repository, to ease the process of installing my setup on a new machine. Once the files are installed (actually, symlinks created in ${ZDOTDIR-~} that point to the files in the repository), I want the script to reload them, without replacing the current process via exec (and therefore losing the history), and without sourcing the files one-by-one (and risking the possibility that I may load them in the wrong order or miss some other part of the ZSH startup process).

Is there some facility built in to ZSH, or some other way to tell it to reload everything, as if it was a freshly started instance, while preserving the command history?

EDIT: Hah. Um.. hrm.. of course, I've now wiped out my .zshrc and .zlogin, Though the latter is no great hardship (It just had RVM's setup in it, which is easily recovered). The former, however, hurts. Anyone who can tell me how to recover a .zshrc from a shell that has sourced it gets all my super bonus points. An answer to the original question will still be marked as accepted, of course.

I had a problem. I wrote a shell script. Now I have two problems :)

Jerrilyn answered 16/4, 2016 at 19:47 Comment(0)
P
21

You can enable the option INC_APPEND_HISTORY. From the manpage:

INC_APPEND_HISTORY

This options works like APPEND_HISTORY except that new history lines are added to the $HISTFILE incrementally (as soon as they are entered), rather than waiting until the shell exits. The file will still be periodically re-written to trim it when the number of lines grows 20% beyond the value specified by $SAVEHIST (see also the HIST_SAVE_BY_COPY option).

This way you can then do exec zsh without losing history.

Pegg answered 11/8, 2017 at 15:49 Comment(3)
This is the closest thing I think is probably possible to what I was trying to do. Much obliged.Jerrilyn
How can I enable INC_APPEND_HISTORY?Clerkly
@Clerkly Add setopt inc_append_history to your ~/.zshrc.Pegg
C
156

Usually a source ~/.zshrc should do it.

Carnay answered 16/4, 2016 at 20:10 Comment(2)
Do source ~/.zshenv to reload stuff from that file.Menispermaceous
This doesn't reload aliases on macOS. Use exec zsh to launch a new shell instead.Neophyte
K
72

For oh-my-zsh users

Here is the way to reload the .zshrc without losing the terminal

omz reload

Found here: https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet

Kilovoltampere answered 29/9, 2022 at 12:41 Comment(5)
not working for meReims
@Reims Which version of omz are you using ? did you checked that omz was enabled by default / the terminal app you are using ?Kilovoltampere
thank you - my bad. did not notice this was a specific answer for omzReims
oddly calling source didn't work in my case (changed alias to a function) but this didLiger
Note that omz reload is the same as exec zsh. So if you do not have oh-my-zsh installed you can just useexec zsh which is 2 characters shorter BTW.Haydeehayden
P
21

You can enable the option INC_APPEND_HISTORY. From the manpage:

INC_APPEND_HISTORY

This options works like APPEND_HISTORY except that new history lines are added to the $HISTFILE incrementally (as soon as they are entered), rather than waiting until the shell exits. The file will still be periodically re-written to trim it when the number of lines grows 20% beyond the value specified by $SAVEHIST (see also the HIST_SAVE_BY_COPY option).

This way you can then do exec zsh without losing history.

Pegg answered 11/8, 2017 at 15:49 Comment(3)
This is the closest thing I think is probably possible to what I was trying to do. Much obliged.Jerrilyn
How can I enable INC_APPEND_HISTORY?Clerkly
@Clerkly Add setopt inc_append_history to your ~/.zshrc.Pegg
I
10

This is a bit older, but you can always add a function to your .zshrc that sources all config files for you.

function reload(){
       source ~/.zshrc
       source ~/.zshenv
       ...
   }

So all you'd have to do is to reload in your shell.

Ironic answered 17/5, 2019 at 7:12 Comment(2)
The order matters. Usually .zshenv is read before .zshrc.Karlin
If you do this over and over again the shell slowes downClerkly
L
5

If

source .zshrc

outputs

source: no such file or directory: .zshrc,

you should run below command instead

. ~/.zshrc
Lenoralenore answered 28/7, 2021 at 4:13 Comment(1)
you just need to source the full path in that case: source ~/.zshrcSlipper
C
2

To respect the ZDOTDIR, which should be set by .zshenv, use this combination:

source $HOME/.zshenv && source ${ZDOTDIR:-$HOME}/.zshrc
Cultivation answered 7/1, 2022 at 17:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.