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:
Заключение
Я не сомневаюсь, что многое из написанного можно достигнуть с помощью различных плагинов и скриптов для баша. Но зачем если есть хорошее решение «из коробки». Которое работает, и работает очень хорошо.