Обычно у меня порядка десятка запущенных 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, который указал на это в комментарии.