Найти в Дзене
Вороний блог | Linux и IT

ZSH — Интерактивная командная оболочка для Linux + Oh-My-Zsh

Оглавление
ZSH — Интерактивная командная оболочка для Linux + Oh-My-Zsh
ZSH — Интерактивная командная оболочка для Linux + Oh-My-Zsh

Приветствую!

Сегодня расскажу и покажу, как установить и настроить крутую интерактивную командную оболочку — 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
Установка Z-Shell и вспомогательных утилит
Установка Z-Shell и вспомогательных утилит

Что мы установили:

  • 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:

смена текущей оболочки на Zsh
смена текущей оболочки на Zsh

Вводим y затем Enter, следом пароль от своего пользователя и снова Enter.

Вы заметите, что приглашение (prompt) командной строки изменилось:

Приглашение (prompt) командной строки изменилось
Приглашение (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

Для удобства включите отображение подсветки синтаксиса для данного файла:

Открытие файла в релакторе xed
Открытие файла в релакторе xed

Для разнообразия я буду редактировать файл в vim:

vim ~/.zshrc

Кстати я недавно сделал вводную статью по виму (: VIM — Консольный редактор: знакомство

В файле редактируем указанные ниже строки.

  • Меняем тему:
# Мняем с:
ZSH_THEME="robbyrussell"
# на:
ZSH_THEME="agnoster"
-10

Список доступных тем можно посмотреть в директории ~/.config/oh-my-zsh/themes.Посмотреть превью каждой темы можно в официальном GitHub репозитории разработчиков: https://github.com/ohmyzsh/ohmyzsh/wiki/Themes

  • Отключаем автообновление Oh-My-Zsh:
# Раскоменчиваем строку:
zstyle ':omz:update' mode disabled
Отключаем автообновление Oh-My-Zsh
Отключаем автообновление Oh-My-Zsh
  • Указываем список плагинов:
# Находим параметр 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:

Механизм подстановки при нажатии клавиши Tab
Механизм подстановки при нажатии клавиши Tab

Оболочка позволяет переключаться между возможными вариантами и при выделении нужного, по нажатию Enter, указать его в командной строке. Не ну прелесть)

Также по умолчанию Zsh визуально отображает результат выполнения предыдущей команды:

Красный крестик указывает на ошибку
Красный крестик указывает на ошибку

Еще из коробки включен плагин git. Если вы пользуетесь системой контроля версий, то этот плагин невероятно упростит вам жизнь)

Работа плагина git
Работа плагина git

Про утилиту fzf и её плагин для Oh-My-Zsh

FZF (Fuzzy Finder, «нечеткий» пацанчик поисковик) — это мощный инструмент командной строки, предоставляющий возможность быстрого и интуитивного поиска файлов, директорий и других элементов в терминале.

Если ввести в терминале одноименную команду, то активируется режим «размытого» поиска по текущей директории:

fzf
Утилита fzf
Утилита 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'

Не забудьте про отступы.

Добавьте указанные выше строки в начале файла:

Настройка цветов для fzf
Настройка цветов для fzf

Сохраняем и выходим. Теперь работая в терминале нажмите Ctrl + r для активации встроенной в оболочку функции интерактивного поиска по истории команд:

Плагин fzf для oh-my-zsh
Плагин fzf для oh-my-zsh

Введите искомый ключ или перемещайте курсор с помощью клавиш стрелок на клавиатуре:

Плагин fzf для oh-my-zsh
Плагин fzf для oh-my-zsh

При нажатии Enter команда под курсором вставиться в командную строку. Для выхода из режима поиска нажмите клавишу Esc.

Ручное обновление Oh-My-Zsh

Ранее мы с вами отключили автоматическую проверку обновлений фреймворка (потому что меня это раздражает). При необходимости процесс обновления можно запустить вручную с помощью такой команды:

omz update
Ручное обновление Oh-My-Zsh
Ручное обновление Oh-My-Zsh

Минималистичный prompt оболочки

При использовании минималистичного prompt могут возникнуть проблемы при использовании scp и sftp на этом хосте. Имейте это ввиду. Сам наткнулся на такой нюанс. Подробности тут.

Если вы жаждете минимализма и вам кажется, что постоянно лицезреть имя своего пользователя и компьютера это визуальный шум, то добавьте в конец файла ~/.zshrc такую строку:

prompt_context() [ ]
Минималистичный prompt оболочки
Минималистичный prompt оболочки

Принципиально в конец файла! Иначе получите ошибку) Сохраняем, закрываем. Применяем изменения:

source ~/.zshrc
Минималистичный prompt оболочки
Минималистичный prompt оболочки

Ничего лишнего, только невроз.

Смена оболочки с 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, то тем самым изменили ему оболочку.
Смена оболочки с bash на zsh для пользователя root
Смена оболочки с bash на zsh для пользователя root

Как видно, при работе от root оболочка визуально сообщает нам об этом меткой Волан-де-Морта символом молнии.

Должен предупредить вас, что использование подобной оболочки с расширениями, и тем более с включенным автоматическим обновлением для пользователя root — считается небезопасным. Для использования на домашнем компьютере я не вижу ничего страшного. Но, например на продуктовых серверах от такой идеи, пожалуй стоит воздержаться)

Послесловие

Под конец, небольшое сравнение визуализации работы с Bash и Zsh:

Слева bash, справа zsh
Слева bash, справа zsh

И там и там выполнены одни и те же действия. Тут хорошо видно, что Zsh предоставляет больше интерактивности, чем Bash. Но Bash я все равно люблю, если что) Просто с Zsh удобно взаимодействовать с терминалом на ежедневной основе.

Спасибо, за ваше время. Успехов вам!

Полезные источники

Мои ссылки: