6

Обычно у меня порядка десятка запущенных zsh-процессов. Когда я редактирую свои конфигурационные файлы, я бы хотел, чтобы их все заново инициализировали. В идеале это не означало бы полного их уничтожения и перезапуска, поскольку это теряет мой рабочий каталог, любые переменные оболочки, которые я установил локально, временные псевдонимы и т.д. В данной оболочке я могу exec "${SHELL}" и это прекрасно работает. , но я хочу, чтобы заставить все активные экземпляры zsh под моим логином сделать это.

1 ответ1

3

Вы можете определить функцию ловушки:

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, который указал на это в комментарии.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .