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

Сегодня расскажу и покажу, как установить и настроить крутую интерактивную командную оболочку — Zsh. При должной настройке, данная оболочка очень сильно упрощает жизнь работу в командной строке и делает сей процесс даже приятным)

Предисловие

Zsh (Z-Shell) — это расширенная командная оболочка для Unix-подобных операционных систем, предоставляющая дополнительные функции и возможности по сравнению с более стандартной оболочкой, такой как Bash. Zsh поддерживает автодополнение, расширенное форматирование вывода, мощную конфигурацию и другие продвинутые функции для повышения производительности и удобства при работе с командной строкой.

Если вы читали мои предыдущие посты, то вероятно знаете, что все манипуляции с командной строкой я провожу в среде дистрибутива Linux Mint, на данный момент версии 21, редакции Cinnamon. Материал данной статьи не исключение.

Если что, вот несколько материалов по этой теме:

Установка Z-Shell и вспомогательных утилит

Открываем терминал и выполняем команду установки:

BASH
sudo apt update && sudo apt install -y zsh fzf git curl
Нажмите, чтобы развернуть и увидеть больше

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

После отработки команды, проверяем все ли установилось в нашу систему:

BASH
whereis {zsh,fzf,git,curl}
Нажмите, чтобы развернуть и увидеть больше

С помощью синтаксиса фигурных скобок { } в командной строке Linux можно указать список значений. В данном случае команда whereis обработает их поочередно и выведет результат в стандартный вывод.

Установка powerline шрифта для GUI сеанса

Для корректной отрисовки иконок в вашем терминале во время графической сессии — необходимо использовать специальный мноноширный иконочный powerline шрифт🤯, например, из проекта Nerd fonts.

Мои читатели знают, что я предпочитаю шрифт Hack ☝️. Вот простой пример, как его можно установить:

BASH
# создаем директорию шрифта
sudo mkdir /usr/share/fonts/Hack

# скачиваем архив со шрифтами
curl -fsSLO \
    $(curl -s https://api.github.com/repos/ryanoasis/nerd-fonts/releases/latest \
    | grep browser_download_url \
    | grep 'Hack.zip' \
    | cut -d  '"' -f 4)

# распаковываем архив, коприруем шрифты в систем
sudo unzip ./Hack.zip -d /usr/share/fonts/Hack/ && rm -f ./Hack.zip
Нажмите, чтобы развернуть и увидеть больше

После установки шрифта, активируйте его в настройках вашего терминала🛠.

В Gnome-terminal это делается так:

Все на месте, идём дальше.

Установка и настройка фреймворка 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, которую мы установили ранее. Выполняем в терминале:

BASH
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 команды в терминале:

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

BASH
xed ~/.zshrc
Нажмите, чтобы развернуть и увидеть больше

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

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

BASH
vim ~/.zshrc
Нажмите, чтобы развернуть и увидеть больше

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

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

BASH
# Мняем с:
ZSH_THEME="robbyrussell"

# на:
ZSH_THEME="agnoster"
Нажмите, чтобы развернуть и увидеть больше

Список доступных тем можно посмотреть в директории ~/.config/oh-my-zsh/themes.

Посмотреть превью каждой темы можно в официальном GitHub репозитории разработчиков: https://github.com/ohmyzsh/ohmyzsh/wiki/Themes

BASH
# Раскоменчиваем строку:
zstyle ':omz:update' mode disabled
Нажмите, чтобы развернуть и увидеть больше

BASH
# Находим параметр plugins и проводим к виду:
plugins=(git zsh-autosuggestions fast-syntax-highlighting fzf cmdtime)
Нажмите, чтобы развернуть и увидеть больше

Сохраняем содержимое и применяем внесенные изменения специальной командой:

BASH
source ~/.zshrc
Нажмите, чтобы развернуть и увидеть больше

Наш prompt оболочки изменился:

Для полного применения настроек измененной оболочки рекомендую перезайти в учетную запись пользователя на вашем рабочем столе.

Если вы хотите получить резделительную полосу, как например тут:

То клик на спойлер)

Установите из моего GitHub модифицированный файл с темой agnoster:

BASH
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 на:

BASH
ZSH_THEME="agnoster-r4ven"
Нажмите, чтобы развернуть и увидеть больше

Код полосы взял из соседней темы af-magic, немного адаптировав🙃

Отвечает за нее конкретно этот блок/функция:

BASH
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%}", чтобы получилось вот так:

BASH
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
}
Нажмите, чтобы развернуть и увидеть больше

Демонстрация работы Zsh + Oh-My-Zsh

Для демонстрации выполним команду:

BASH
ls -l Документы
Нажмите, чтобы развернуть и увидеть больше

Тут видно:

Отдельная особенность Zsh это механизм подстановки при нажатии клавиши Tab. Например, введите команду ls затем пробел и несколько раз клавишу Tab:

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

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

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

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

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

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

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

BASH
fzf
Нажмите, чтобы развернуть и увидеть больше

Плагин fzf для Oh-My-Zsh используется для быстрого поиска по истории команд.

По умолчанию Oh-My-Zsh не подхватывает цветовую схему терминала для отображения цветов в fzf. Поэтому их нужно задавать вручную в виде переменной в файле конфигурации ~/.zshrc. Вот пример для цветовой схемы Nord:

BASH
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

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

BASH
omz update
Нажмите, чтобы развернуть и увидеть больше

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

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

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

BASH
prompt_context() [ ]
Нажмите, чтобы развернуть и увидеть больше

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

BASH
source ~/.zshrc
Нажмите, чтобы развернуть и увидеть больше

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

Смена оболочки с bash на zsh для пользователя root

Чтобы получить аналогично настроенную оболочку и для root пользователя, выполняем такие команды:

BASH
# копируем файлы нашего пользователя в директорию пользователя 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:

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

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

Рекомендую также изучить статью: Тонкая настройка .zshrc при использовании oh-my-zsh.

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

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

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/software/zsh-interaktivnaya-komandnaya-obolochka-dlya-linux-oh-my-zsh/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша