编辑后如何将更改应用于 .zshrc 文件?

Bas*_*que 15 zsh dot-files

我刚刚编辑了 .zshrc 文件以在 FreeBSD上配置Z shell,例如更新PATH系统变量。

path+=/usr/local/openjdk12/bin
Run Code Online (Sandbox Code Playgroud)

如何使更改生效?

我必须注销并重新登录吗?有没有办法立即运行该文件?

Gil*_*il' 17

重启zsh

Zsh.zshrc在启动时读取。您不需要注销并重新登录。只需关闭终端并打开一个新终端,您就可以.zshrc在这个新终端中获得新的信息。但是你可以让这更直接。只需告诉 zsh 重新启动自己:

exec zsh
Run Code Online (Sandbox Code Playgroud)

如果您在 zsh 提示符下运行它,这会将 zsh 的当前实例替换为在同一终端中运行的新实例。新实例具有与前一个相同的环境变量,但具有新的shell(非导出)变量,并且它开始了一个新的历史记录(因此它会在典型配置中混入来自其他终端的命令)。任何后台工作都被否认。

重读 .zshrc

您也可以告诉 zsh 重新读取.zshrc. 这具有保留 shell 历史记录、shell 变量和后台作业知识的优点。但是,根据您在.zshrc. .zshrc如果您运行两次,重新读取运行的命令可能无法正常工作或无法正常工作。

. ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

.zshrc如果您希望能够运行两次,您可以做太多的事情来枚举所有可以和不可以放入的东西。这里只是一些常见的问题:

  • 如果您附加到一个变量(例如fpath+=(~/.config/zsh)chpwd_functions+=(my_chpwd)),这将再次附加相同的元素,这可能是也可能不是问题。
  • 如果您定义别名,并且还使用与命令相同的名称,则该命令现在将运行别名。例如,这有效:
    function foo { … }
    alias foo='foo --common-option'
    
    Run Code Online (Sandbox Code Playgroud) 但这不会,因为第二次获取文件时,foo ()将扩展别名:
    foo () { … }
    alias foo='foo --common-option'
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您修补现有的 zsh 函数,您现在将修补您自己的版本,这可能会造成混乱。
  • 如果您执行诸如“交换两个键的绑定”之类的操作,那么第二次就不会执行您想要的操作。


Kus*_*nda 5

对 shell 初始化文件的更改将在您启动的下一个shell 中生效,例如,如果您打开一个新的图形终端或注销并再次登录。如果您所做的更改会以某种方式影响您的桌面环境(我不知道可能是哪种更改),则需要注销并再次登录。

可以使用. /path/to/filename. ~/.zshrc在您的情况下)获取文件或从命令行使用 启动一个新的shell会话zsh,但这几乎从来都不是一个好主意,因为它可能会产生不需要的后果,例如向$PATH变量添加重复路径或启动额外的ssh-agent进程或无论您在该文件中做什么。更改也不会是已经启动的可见程序。

对于诸如$PATH无条件添加之类的更改,您显然可以在当前 shell 中运行添加的命令:

$ path+=/usr/local/openjdk12/bin
Run Code Online (Sandbox Code Playgroud)

这将(在zsh)将/usr/local/openjdk12/bin目录添加到当前 shell 会话中的末尾$PATH(以及$path数组的末尾zsh)。同样,此更改$PATH不会影响已经运行的进程。

  • 如果 OP 刚刚启动了一个新的 `zsh` shell,那些 _unwanted 后果_ 也会被触发。通常在 `zsh` 中执行 `typeset -U path`,因此 `$PATH` 条目始终保持唯一。`$PATH` 最好设置在 `~/.zprofile` 中。 (2认同)