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

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

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

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

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

Еще раз.

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

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

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

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

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

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

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

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

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

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

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

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

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

Нажмем tab.

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

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

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

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

Замена пути

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

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

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. (Включается плагином, history-substring-search в oh-my-zsh, о котором ниже).

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

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

oh-my-zsh

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

Плагины которыми я пользуюсь:

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

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

Заключение

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