如何在不替换当前shell的情况下重新加载ZSH配置文件?

81
我该如何告诉ZSH重新加载自身,就像是一个全新的shell,但又不会丢失历史记录?
这个问题的背景是,我花费了很长时间来构建我的ZSH设置,如果我的当前机器出现故障或驱动器损坏等情况,我会很遗憾地失去它。为此,我将所有本地ZSH配置文件放在了git存储库中。到目前为止还没有什么新东西。
但现在我想在存储库中添加一个“安装”脚本,以便于在新机器上安装我的设置过程。一旦文件被安装(实际上是在${ZDOTDIR-~}中创建符号链接,指向存储库中的文件),我希望脚本可以重新加载它们,而不用通过exec替换当前进程(因此不会丢失历史记录),也不用逐个源化文件(并冒着可能以错误的顺序加载它们或错过ZSH启动过程的某些其他部分的风险)。
是否有一些内置于ZSH的设施或其他方法可以告诉它重新加载所有内容,就像是一个全新启动的实例,同时保留命令历史记录?

编辑:哈。嗯...当然,我现在已经清空了我的.zshrc和.zlogin文件,虽然后者不是什么大问题(它只是RVM的设置,很容易恢复)。但前者确实让人痛苦。任何能告诉我如何从已经加载了.zshrc的shell中恢复它的人都将得到我所有的超级加分。当然,对原始问题的答案仍将被标记为已接受。

我有一个问题。我写了一个shell脚本。现在我有两个问题 :)

6个回答

128
通常情况下,执行 source ~/.zshrc 命令即可。

1
执行 source ~/.zshenv 命令以重新加载该文件中的内容。 - Jonny

48

对我来说不起作用。 - ng10
@ng10 你正在使用哪个版本的 omz?你检查过 omz 是否被默认启用或者终端应用程序是否正在使用它了吗? - G. Frx
谢谢 - 我的错,没有注意到这是针对omz的具体答案。 - ng10
奇怪的是,在我的情况下,调用“source”并没有起作用(将别名更改为函数),但这样做可以。 - jcollum

20
您可以启用选项INC_APPEND_HISTORY。从man页中可以了解到:

INC_APPEND_HISTORY

此选项的作用类似于APPEND_HISTORY,但新的历史记录行是按增量方式添加到$HISTFILE中(即它们输入后立即添加),而不是等待shell退出。当行数比$SAVEHIST指定的值增长20%时,文件仍将定期重新编写以修剪它(请参见HIST_SAVE_BY_COPY选项)。

这样一来,您就可以使用exec zsh而不会失去历史记录。

2
我想这可能是我所期望实现的最接近的东西。非常感谢。 - Jon Carter
我如何启用 INC_APPEND_HISTORY - alper
2
@alper 在你的 ~/.zshrc 文件中添加 setopt inc_append_history - JoL

10

这个内容有点旧,但您可以向.zshrc文件中添加一个函数,以便为您引用所有配置文件。

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

所以你只需要在命令行中reload即可。

3
顺序很重要。通常情况下,.zshenv会在.zshrc之前被读取。 - VimNing
如果您一遍又一遍地这样做,Shell 就会变慢。 - alper

5

如果

source .zshrc

输出

来源:找不到文件或目录:.zshrc,

您应该运行以下命令而不是上述命令

. ~/.zshrc

2
在这种情况下,您只需要在终端中输入以下命令:source ~/.zshrc - taj

1
要尊重ZDOTDIR,它應該由.zshenv設置,使用以下組合:
source $HOME/.zshenv && source ${ZDOTDIR:-$HOME}/.zshrc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接