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

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

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

答案1

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

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

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

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

killall -USR1 zsh

但请注意,如果你正在运行 zsh 实例没有定义的函数TRAPUSR1(),这些将在 时退出USR1!这就是为什么你应该在 中定义陷阱/etc/zshenv,因为这是唯一被读取的文件每一个zsh 实例,+包括以 启动的脚本和会话zsh -f


+感谢@Adaephon,他指出了这一点一条评论

相关内容