Приветствую!
Сегодня расскажу и покажу, как установить и настроить крутую интерактивную командную оболочку — Zsh. При должной настройке, данная оболочка очень сильно упрощает жизнь работу в командной строке и делает сей процесс даже приятным)
Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram.
Предисловие
Zsh (Z Shell) — это расширенная командная оболочка для Unix-подобных операционных систем, предоставляющая дополнительные функции и возможности по сравнению с более стандартной оболочкой, такой как Bash. Zsh поддерживает автодополнение, расширенное форматирование вывода, мощную конфигурацию и другие продвинутые функции для повышения производительности и удобства при работе с командной строкой.
Пожалуйста, имейте в виду, что Zsh и Bash — это две разные командные оболочки. Они имеют существенные различия как с точки зрения синтаксиса, так и функциональности. Если речь идет о простом использовании стандартных и системных утилит, то вы скорее всего не заметите разницы между ними. Но если говорить об использовании внутренних механизмов оболочки, которые обычно задействуются в скриптах — то будьте готовы к тому, что они могут потребовать адаптации при переходе между этими оболочками.Моя рекомендация: используйте Zsh для повседневной работе в командной строке, а все скрипты автоматизации пишите на Bash. Истина, как обычно, где-то посередине)
Если вы читали мои предыдущие посты, то вероятно знаете, что все манипуляции с командной строкой я провожу в среде дистрибутива Linux Mint, на данный момент версии 21, редакции Cinnamon. Материал данной статьи не исключение.
Если что, вот несколько материалов по этой теме:
TLDR
# установливаем Z-Shell и вспомогательных утилит
sudo apt update && sudo apt install -y zsh fzf git curl
# проверяем все ли установилось в нашу систему whereis {zsh,fzf,git,curl}
# установливаем Oh-My-Zsh - отвечаем yes
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# устанавливаем плагин zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
# устанавливаем плагин fast-syntax-highlighting
git clone https://github.com/zdharma-continuum/fast-syntax-highlighting ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/fast-syntax-highlighting
# устанавливаем плагин cmdtime
git clone https://github.com/tom-auger/cmdtime ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/cmdtime
# меняем тему на agnoster
sed -i 's/^ZSH_THEME=.*/ZSH_THEME="agnoster"/' ~/.zshrc
# отключаем автообновления Oh-My-Zsh
sed -i "s/^#.*omz:update.*disabled/zstyle ':omz:update' mode disabled/" ~/.zshrc
# активируем установленные плагины
sed -i 's/^plugins=\(.*\)/plugins=\(git zsh-autosuggestions fast-syntax-highlighting fzf cmdtime\)/' ~/.zshrc
# задаем цвета для плагина fzf (это всё одна команда)
echo "export FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS'
--color=fg:#e5e9f0,bg:#3b4252,hl:#81a1c1
--color=fg+:#e5e9f0,bg+:#3b4252,hl+:#81a1c1
--color=info:#eacb8a,prompt:#bf6069,pointer:#b48dac
--color=marker:#a3be8b,spinner:#b48dac,header:#a3be8b'\n\n\
$(cat ~/.zshrc)" > ~/.zshrc
# применяем внесенные изменения
source ~/.zshrc
# для минималистичного prompt
echo "prompt_context() [ ]" >> ~/.zshrc && source ~/.zshrc
## настройка Oh-My-Zsh для root пользователя
# копируем файлы нашего пользователя в директорию пользователя root
sudo cp -r {~/.oh-my-zsh,~/.zshrc} /root/
# меняем оболочку по умолчанию у root
sudo chsh -s /usr/bin/zsh
# переключаемся в root для проверки
sudo -s
Установка Z-Shell и вспомогательных утилит
Открываем терминал и выполняем команду установки:
sudo apt update && sudo apt install -y zsh fzf git curl
Что мы установили:
- zsh — сама оболочка;
- fzf — утилита «нечёткого» поиска (опционально);
- git — система контроля версий;
- curl — утилита взаимодействия с веб сервисами.
После отработки команды, проверяем все ли установилось в нашу систему:
whereis {zsh,fzf,git,curl}
С помощью синтаксиса фигурных скобок { } в командной строке Linux можно указать список значений. В данном случае команда whereis обработает их поочередно и выведет результат в стандартный вывод.
Все на месте, идём дальше.
Выполним установку Oh-MyZsh, установим два дополнительных плагина и выполним начальную настройку оболочки.
Установка Oh-My-Zsh в Linux Mint 21
И так, Oh-My-Zsh — это проект с открытым исходным кодом, представляющий собой фреймворк и набор расширений для оболочки Zsh.
Зачем вообще нужен какой-то Oh-My-Zsh, если мы только что установили Zsh? Дело в том, что низкоуровневое конфигурирование оболочки — это довольно сложный процесс, сравнимый с написанием ПО на определенном языке программирования. Но т.к. множество людей использующих командную строку Linux не являются программистами, а задействовать потенциал оболочки хочется, разработчики проекта Oh-My-Zsh любезно предоставили сообществу такую возможность.
Все настройки с несложным синтаксисом задаются в одном файле конфигурации ~/.zshrc, а остальное уже делает сам фреймворк. В этом ми убедимся ниже.
Установка данного фреймворка производится с помощью скрипта, вызываемого командой, которая указана на официальном сайте проекта: https://ohmyz.sh/
В команде используется утилита curl, которую мы установили ранее. Выполняем в терминале:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Чтобы посмотреть содержимое файла скрипта просто перейдите по: https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
При выполнении у нас спросят, хотим ли мы изменить нашу текущую оболочку на Zsh:
Вводим y затем Enter, следом пароль от своего пользователя и снова Enter.
Вы заметите, что приглашение (prompt) командной строки изменилось:
После установки в домашней директории пользователя появятся конфигурационный файл оболочки .zshrc и папка с файлами фреймворка .oh-my-zsh:
Установка плагинов динамической подсветки и автоподстановки
По умолчанию Oh-My-Zsh уже имеет множество плагинов. Посмотреть их список можно в директории ~/.oh-my-zsh/plugins. Дополнительно установим еще 3 кастомных плагина для: быстрой динамической подсветки синтаксиса, умной автоподстановки команд и отображения времени, затраченного на выполнение команды.
Установка производится путем клонирования репозиториев с файлами плагинов с помощью утилиты git в папку ~/.oh-my-zsh/custom/plugins. Поочередно выполняем 3 команды в терминале:
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zdharma-continuum/fast-syntax-highlighting ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/fast-syntax-highlighting
git clone https://github.com/tom-auger/cmdtime ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/cmdtime
Правка конфигурационного файла .zshrc
Теперь немного настроим наш Zsh. Открываем на редактирование файл конфигурации ~/.zshrc любым удобным вам редактором. Например, xed:
xed ~/.zshrc
Для удобства включите отображение подсветки синтаксиса для данного файла:
Для разнообразия я буду редактировать файл в vim:
vim ~/.zshrc
Кстати я недавно сделал вводную статью по виму (: VIM — Консольный редактор: знакомство
В файле редактируем указанные ниже строки.
- Меняем тему:
# Мняем с:
ZSH_THEME="robbyrussell"
# на:
ZSH_THEME="agnoster"
Список доступных тем можно посмотреть в директории ~/.config/oh-my-zsh/themes.Посмотреть превью каждой темы можно в официальном GitHub репозитории разработчиков: https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
- Отключаем автообновление Oh-My-Zsh:
# Раскоменчиваем строку:
zstyle ':omz:update' mode disabled
- Указываем список плагинов:
# Находим параметр plugins и проводим к виду:
plugins=(git zsh-autosuggestions fast-syntax-highlighting fzf cmdtime)
Сохраняем содержимое и применяем внесенные изменения специальной командой:
source ~/.zshrc
Наш prompt оболочки изменился:
Для полного применения настроек измененной оболочки рекомендую перезайти в учетную запись пользователя на вашем рабочем столе.
Демонстрация работы Zsh + Oh-My-Zsh
Для демонстрации выполним команду:
ls -l Документы
Тут видно:
- Вся команда имеет подсветку синтаксиса (плагин fast-syntax-highlighting);
- После отработки команды справа отображается время, потраченное на ее выполнение (плагин cmdtime);
- При начале набора команды, которая уже вводилась ранее, оболочка предлагает подсказку тусклым цветом (плагин zsh-autosuggestions). При нажатии клавиши стрелки вправо — произойдет подстановка команды. Данные для подстановки оболочка берет из файла истории: ~/.zsh_history.
Отдельная особенность Zsh это механизм подстановки при нажатии клавиши Tab. Например, введите команду ls затем пробел и несколько раз клавишу Tab:
Оболочка позволяет переключаться между возможными вариантами и при выделении нужного, по нажатию Enter, указать его в командной строке. Не ну прелесть)
Также по умолчанию Zsh визуально отображает результат выполнения предыдущей команды:
Еще из коробки включен плагин git. Если вы пользуетесь системой контроля версий, то этот плагин невероятно упростит вам жизнь)
Про утилиту fzf и её плагин для Oh-My-Zsh
FZF (Fuzzy Finder, «нечеткий» пацанчик поисковик) — это мощный инструмент командной строки, предоставляющий возможность быстрого и интуитивного поиска файлов, директорий и других элементов в терминале.
Если ввести в терминале одноименную команду, то активируется режим «размытого» поиска по текущей директории:
fzf
Плагин fzf для Oh-My-Zsh используется для быстрого поиска по истории команд.
По умолчанию Oh-My-Zsh не подхватывает цветовую схему терминала для отображения цветов в fzf. Поэтому их нужно задавать вручную в виде переменной в файле конфигурации ~/.zshrc. Вот пример для цветовой схемы Nord:
export FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS'
--color=fg:#e5e9f0,bg:#3b4252,hl:#81a1c1
--color=fg+:#e5e9f0,bg+:#3b4252,hl+:#81a1c1
--color=info:#eacb8a,prompt:#bf6069,pointer:#b48dac
--color=marker:#a3be8b,spinner:#b48dac,header:#a3be8b'
Не забудьте про отступы.
Добавьте указанные выше строки в начале файла:
Сохраняем и выходим. Теперь работая в терминале нажмите Ctrl + r для активации встроенной в оболочку функции интерактивного поиска по истории команд:
Введите искомый ключ или перемещайте курсор с помощью клавиш стрелок на клавиатуре:
При нажатии Enter команда под курсором вставиться в командную строку. Для выхода из режима поиска нажмите клавишу Esc.
Ручное обновление Oh-My-Zsh
Ранее мы с вами отключили автоматическую проверку обновлений фреймворка (потому что меня это раздражает). При необходимости процесс обновления можно запустить вручную с помощью такой команды:
omz update
Минималистичный prompt оболочки
При использовании минималистичного prompt могут возникнуть проблемы при использовании scp и sftp на этом хосте. Имейте это ввиду. Сам наткнулся на такой нюанс. Подробности тут.
Если вы жаждете минимализма и вам кажется, что постоянно лицезреть имя своего пользователя и компьютера это визуальный шум, то добавьте в конец файла ~/.zshrc такую строку:
prompt_context() [ ]
Принципиально в конец файла! Иначе получите ошибку) Сохраняем, закрываем. Применяем изменения:
source ~/.zshrc
Ничего лишнего, только невроз.
Смена оболочки с bash на zsh для пользователя root
Чтобы получить аналогично настроенную оболочку и для root пользователя, выполняем такие команды:
# копируем файлы нашего пользователя в директорию пользователя root:
sudo cp -r {~/.oh-my-zsh,~/.zshrc} /root/
# меняем оболочку по умолчанию у root:
sudo chsh -s /usr/bin/zsh
# переключаемся в root для проверки:
sudo -s
Утилита chsh в Linux позволяет пользователю изменить оболочку по умолчанию. Т.к. мы выполнили эту команду от имени суперпользователя root с помощью sudo, то тем самым изменили ему оболочку.
Как видно, при работе от root оболочка визуально сообщает нам об этом меткой Волан-де-Морта символом молнии.
Должен предупредить вас, что использование подобной оболочки с расширениями, и тем более с включенным автоматическим обновлением для пользователя root — считается небезопасным. Для использования на домашнем компьютере я не вижу ничего страшного. Но, например на продуктовых серверах от такой идеи, пожалуй стоит воздержаться)
Послесловие
Под конец, небольшое сравнение визуализации работы с Bash и Zsh:
И там и там выполнены одни и те же действия. Тут хорошо видно, что Zsh предоставляет больше интерактивности, чем Bash. Но Bash я все равно люблю, если что) Просто с Zsh удобно взаимодействовать с терминалом на ежедневной основе.
Спасибо, за ваше время. Успехов вам!
Полезные источники
Мои ссылки:
- Мой основной сайт - r4ven.me
- Мой телеграм - t.me/r4ven_me