Обычно у меня порядка десятка запущенных zsh-процессов. Когда я редактирую свои конфигурационные файлы, я бы хотел, чтобы их все заново инициализировали. В идеале это не означало бы полного их уничтожения и перезапуска, поскольку это теряет мой рабочий каталог, любые переменные оболочки, которые я установил локально, временные псевдонимы и т.д. В данной оболочке я могу exec "${SHELL}" и это прекрасно работает. , но я хочу, чтобы заставить все активные экземпляры zsh под моим логином сделать это.
1 ответ
Вы можете определить функцию ловушки:
TRAPUSR1() {
  if [[ -o INTERACTIVE ]]; then
     {echo; echo execute a new shell instance } 1>&2
     exec "${SHELL}"
  fi
}
Эта функция вызывается, когда запущенная оболочка ловит сигнал USR1 , инициированный kill -USR1 <PID> . Он проверяет, является ли работающий экземпляр zsh интерактивным, и если да, заменяет его новым.+
Итак, чтобы обновить все запущенные интерактивные сессии zsh за один раз, просто используйте
killall -USR1 zsh
Но имейте в виду, что если у вас запущены экземпляры zsh без определенной функции TRAPUSR1() , они завершатся при USR1 ! Вот почему вы должны определить ловушку в /etc/zshenv , так как это единственный файл, который читается каждым экземпляром zsh, + включая сценарии и сеансы, начинающиеся с zsh -f .
+ Кредиты идут на @Adaephon, который указал на это в комментарии.
