Заметки с тегом
Shell
Почему стоит использовать zsh вместо bash

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

Давайте рассмотрим особенности zsh, которые покажут чем эта оболочка лучше bash. И почему стоит хотя бы попробовать использовать её в повседневной жизни.

Автодополнение для cd

Наберем в баш cd и нажмем таб.

bash cd tab first

Еще раз.

bash cd tab second

Каждый раз будет выводиться только список файлов в текущей директории. Так продолжится пока не ввести первые буквы искомого файла, тогда отобразиться отфильтрованный список. И только если введенные данные позволяют точно определить значение, то подставится полное имя файла или папки.

Теперь наберем cd в zsh и нажмем таб.

zsh cd tab first

В строку ввода подставилось первое значение из списка. Нажимаем таб еще раз.

zsh cd tab second

Подставилось второе значение из списка! Удобно.

Автодополнение для команд на примере git

Введем в баш git и нажмем таб.

bash git tab

Никакой помощи не появилось. Только отображаются файлы данной директории.

Проделаем ту же операцию в zsh.

zsh git tab

Отобразился список команд с описанием. Это гораздо информативнее.

Да, установив пакет bash-completion, подобное поведение появится и в баше. Но выводить информацию как в zsh не получится:

  • Не будет итерации по значениям, как в пункте про cd;
  • Не будет справочной информации, только список значений.

Раскрытие полного пути

Zsh поддерживает раскрытие полного пути на основе неполных данных. Введем шаблон пути:

zsh path expansion first

Нажмем tab.

zsh path expansion second

Путь до директории полностью раскрылся. Не пришлось вводить лишних символов.

Но что, если заданному пути соответствует несколько путей? Введем cd u/l/g и нажмем таб.

zsh path expansion third

Путь раскрылся до возникновения неопределенности. Нажимаем таб еще раз, и перед нами предстанет выбор папки.

zsh path expansion fourth

Выбираем табом нужную папку. Последующее нажатие таба раскроет задуманный путь до конца.

Замена пути

Zsh поддерживает замену части пути. Рассмотрим на примере. Введем cd /usr/local/bin. Но подождите, я хотел cd /usr/local/share! Не проблема, вводим команду cd bin share и получаем заветный путь:

zsh path replacement first

Возможно, это не самый убедительный пример. Того же эффекта можно достичь просто написав cd ../share. Но рассмотрим следующий случай:

zsh path replacement second

B баш тут бы пришлось изрядно постараться (cd ../../../).

Псевдонимы

Обычные псевдонимы задаются так:

alias ls=’ls —color=auto’

В zsh существует еще 2 типа псевдонима.

Первый — глобальный (global). Может вызываться в любом месте команды. Задается ключом -g.

alias -g gp='| grep -i'

$ ps ax gp docker
=> ps ax | grep -i docker

В примере, вместо написания | grep -i, в середине выражения, использовался псевдоним gp. Удобно.

Второй тип — суффиксный (suffix). Указывает в каком приложении открывать файл, основываясь на расширении. Задается ключом -s.

alias -s log='less -MN'
alias -s html='chromium'

$ development.log
=> less -MN development.log
$ index.html
=> chromium index.html

Правая строка

Zsh позволяет настроить правую строку приглашения. Туда можно выводить текущую дату, состояние ветки в git и многое другое. Иллюстрация из книги Pro Git:

zsh right prompt example

Поиск в истории по подстроке

Одна из самых кайфовых вещей, которую позволяет делать zsh. (Включается плагином, history-substring-search в oh-my-zsh, о котором ниже).

Например, вводим git pu и нажимаем стрелку вверх.

zsh history substring search

Получили последний запрос, который соответствует введенному шаблону. Дальнейшие нажатия будут выводить следующий результат. Удобно, что для поиска совершаются минимальные действия.

oh-my-zsh

Фреймворк для легкой настройки и установки плагинов и тем оформления. Содержит в себе уже более 200 плагинов. Проект доступен на github.

Плагины которыми я пользуюсь: * git — добавляет много полезных сокращений для команд гита. * colored-man-pages — добавляет подсветку на man страницы * command-not-found — подсказывает название команды, если она напечатана с ошибкой * bwana — позволяет открывать man страницы в браузере * sublime — псевдонимы для вызова sublime text * history — псевдонимы для истории команд и поиска по ним * history-substring-search — реализация поиска в истории по подстроке * docker — помощь для команд докера.

Вид популярной темы для zsh:

popular zsh theme

Заключение

Я не сомневаюсь, что многое из написанного можно достигнуть с помощью различных плагинов и скриптов для баша. Но зачем если есть хорошее решение «из коробки». Которое работает, и работает очень хорошо.