Bash Days | Linux | DevOps
23.4K subscribers
158 photos
25 videos
689 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Привет, сегодня будем учить zsh автоматически перечитывать конфиг после изменения.

Каждый раз заёбисто делать source ~/.zhsrc после очередных изменений, да и плагинов я актуальных найти так и не смог.

По-хорошему можно было бы и плагин для сообщества накидать, но я ленивая скотина и обошелся Bash скриптом.


Поэтому открываем ~/.zshrc и пихаем в него такое:

ZSH_LAST_MOD=$(stat -c %Y ~/.zshrc 2>/dev/null || stat -f %m ~/.zshrc)
precmd() {
local new_mod=$(stat -c %Y ~/.zshrc 2>/dev/null || stat -f %m ~/.zshrc)
if [[ $new_mod != $ZSH_LAST_MOD ]]; then
if zsh -n ~/.zshrc; then
source ~/.zshrc
ZSH_LAST_MOD=$new_mod
echo "🔄 .zshrc auto-reloaded (OK)"
else
echo "⚠️ .zshrc has syntax errors — reload skipped"
fi
fi
}


Теперь после каждого изменения файла ~/.zshrc конфиг будет автоматически перечитан. НО перечитан он будет только после проверки, если ты своими кривыми руками где-то накосорезил — идешь нахуй. Логично? Логично!

Как это работает:

1. Сохраняет timestamp последней модификации .zshrc

2. precmd() — специальная функция zsh, которая автоматически вызывается перед каждым выводом prompt (после любой команды или Enter). Вызывается незаметно, идеально для фоновых проверок без вмешательства в работу.

3. Дальше логика, сравнивает timestamps — если .zshrc отредактирован и сохранен, переходит к проверке.

4. zsh -n файл — проверяет синтаксис без выполнения (no-execute mode). Возвращает 0 при успехе, > 0 при ошибках (дубликаты, незакрытые скобки и т.п.).

5. Ну а дальше сообщает тебе, все ок или идешь нахуй.​


Нюанс:

echo 'syntax error' >> ~/.zshrc

/home/user/.zshrc:226: command not found: syntax
🔄 .zshrc auto-reloaded (OK)


Проблема в том, что zsh -n проверяет только синтаксис (скобки, конструкции), но не выполнение команд. Имей это ввиду.

Если сделать так:

echo '# syntax error' >> ~/.zshrc
🔄 .zshrc auto-reloaded (OK)


То всё пройдёт замечательно. Ну ты понял к чему я клоню.

Тема прикольная, экспериментируй.

🛠 #bash #linux #shell

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
542