我通常有十几个 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,他指出了这一点一条评论。