重新加载所有正在运行的 zsh 实例

Pet*_*ons 8 zsh

我通常会运行十几个 zsh 进程。当我编辑我的配置文件时,我想要一种干净的方法来让它们全部重新初始化。理想情况下,这并不意味着完全杀死它们并重新启动,因为这会丢失我的工作目录、我在本地设置的任何 shell 变量、临时别名等。在给定的 shell 中,我可以exec "${SHELL}"并且工作正常,但我想要一种方法强制我登录名下的所有活动 zsh 实例执行此操作。

mpy*_*mpy 5

你可以定义一个陷阱函数:

TRAPUSR1() {
  if [[ -o INTERACTIVE ]]; then
     {echo; echo execute a new shell instance } 1>&2
     exec "${SHELL}"
  fi
}
Run Code Online (Sandbox Code Playgroud)

当正在运行的 shell 捕获到一个USR1由 发起的信号时,将调用此函数kill -USR1 <PID>。它检查正在运行的zsh实例是否是交互式的,如果是,则将其替换为一个新实例。+

因此,要在一次运行中更新所有正在运行的 zsh 交互式会话,只需使用

killall -USR1 zsh
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您已运行zsh的情况下没有TRAPUSR1()定义的函数,这些将在退出USR1!这就是为什么你应该在 中定义陷阱/etc/zshenv,因为这是每个zsh 实例读取的唯一文件,+包括以zsh -f.


+致谢 @Adaephon,他在评论中指出了这一点。