ZSH – Интерактивная командная оболочка для Linux + Oh-My-Zsh
Обновлено 15.01.2025
Приветствую!
Сегодня расскажу и покажу, как установить и настроить крутую интерактивную командную оболочку – Zsh. При должной настройке, данная оболочка очень сильно упрощает жизнь работу в командной строке и делает сей процесс даже приятным)
Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram .
# установливаем 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
Предисловие
Zsh (Z-Shell) – это расширенная командная оболочка для Unix-подобных операционных систем, предоставляющая дополнительные функции и возможности по сравнению с более стандартной оболочкой, такой как Bash. Zsh поддерживает автодополнение, расширенное форматирование вывода, мощную конфигурацию и другие продвинутые функции для повышения производительности и удобства при работе с командной строкой.
Пожалуйста, имейте в виду, что Zsh и Bash – это две разные командные оболочки. Они имеют существенные различия как с точки зрения синтаксиса, так и функциональности. Если речь идет о простом использовании стандартных и системных утилит, то вы скорее всего не заметите разницы между ними. Но если говорить об использовании внутренних механизмов оболочки, которые обычно задействуются в скриптах – то будьте готовы к тому, что они могут потребовать адаптации при переходе между этими оболочками.
Моя рекомендация: используйте Zsh для повседневной работе в командной строке, а все скрипты автоматизации пишите на Bash. Истина, как обычно, где-то посередине)
Если вы читали мои предыдущие посты, то вероятно знаете, что все манипуляции с командной строкой я провожу в среде дистрибутива Linux Mint, на данный момент версии 21, редакции Cinnamon. Материал данной статьи не исключение.
Если что, вот несколько материалов по этой теме:
- Начальная настройка Linux Mint 20/21
- Кастомизация Linux Mint 20/21 + Nord theme
- Обновление Linux Mint 20 до Linux Mint 21.1
Установка 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-My-Zsh
Выполним установку 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
Если вы хотите получить резделительную полосу, как например тут:
Установите из моего GitHub модифицированный файл с темой agnoster
:
curl -fsSL https://raw.githubusercontent.com/r4ven-me/dots/main/.config/oh-my-zsh/custom/themes/agnoster-r4ven.zsh-theme \
-o $ZSH/custom/themes/agnoster-r4ven.zsh-theme
После в .zshrc
необходимо изменить значение переменной ZSH_THEME
на:
ZSH_THEME="agnoster-r4ven"
Код полосы взял из соседней темы af-magic, немного адаптировав🙃
Отвечает за нее конкретно этот блок/функция:
function afmagic_dashes {
# check either virtualenv or condaenv variables
local python_env_dir="${VIRTUAL_ENV:-$CONDA_DEFAULT_ENV}"
local python_env="${python_env_dir##*/}"
# if there is a python virtual environment and it is displayed in
# the prompt, account for it when returning the number of dashes
if [[ -n "$python_env" && "$PROMPT" = *\(${python_env}\)* ]]; then
echo $(( COLUMNS - ${#python_env} - 3 ))
else
echo $COLUMNS
fi
}
И внутри функции build_prompt
добавить строку echo "${FG[004]}${(l.$(afmagic_dashes)..-.)}%{$reset_color%}"
, чтобы получилось вот так:
build_prompt() {
RETVAL=$?
echo "${FG[004]}${(l.$(afmagic_dashes)..-.)}%{$reset_color%}"
prompt_status
prompt_virtualenv
prompt_aws
prompt_context
prompt_dir
prompt_git
prompt_bzr
prompt_hg
prompt_end
}
- Отключаем автообновление 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 удобно взаимодействовать с терминалом на ежедневной основе.
Спасибо, за ваше время. Успехов вам!