ZSH: последний шелл, который Вам когда-либо понадобится!

Вспомнил о своём посте, который когда-то публиковал на welinux’е. Там он пользовался большой популярностью, так как muhas предварительно накалил страсти своей краткой заметкой об этом прекрасном шелле :) Не знаю, почему я не опубликовал эту статью у себя в блоге тогда, но сейчас решил сделать это, т.к. честолюбие (смайлик) требует держать все свои сколь-нибудь крупные заметки и посты именно тут, на Дебиании. Итак, встречайте — «ZSH: последний шелл, который Вам когда-либо понадобится!»!

Чуть более месяца назад muhas рекомендомал welinux’у попробовать Z-Shell. Я попробовал, и мне понравился этот шелл. С тех пор использую только его, а в последнее время увлёкся правкой конфига — написал пару функций, добавил отображение текущей работающей программы в заголовок окна… А недавно случайно наткнулся пусть и на довольно старый, но интересный и содержательный пост о ZSH. Его перевод я и представляю вниманию честной публики.

Оригинал: zsh: The last shell you’ll ever need!
Автор: John Rant
Переводчик: Minoru

Введение

На прошлой неделе всезнающий Mako вдохновил меня на попытку использовать zsh. Я начал с .zshrc, и вот, неделю спустя, я уже рассказываю о нём всем и каждому. Но давайте-ка немного вернёмся в прошлое.

Сначала основы: я надеюсь, большинство из вас понимают, что такое шелл. Шелл является интерфейсом между пользователем и операционной системой. Для практических нужд достаточно понимания на уровне «штука, в которой я набираю команды». Существует огромное множество шеллов; большинство *nix’ов идут с различными умолчальными оболочками. Возможно, самым популярным шеллом на сегодняшний день является GNU Bourne Again Shell, более известный как bash. Ещё одна большая семья шеллов известна как C-шеллы (csh, tcsh) — они названы так в честь их синтаксиса, похожего на C.

Ладно, что такое zsh и почему я должен жаждать его больше, чем мой текущий шелл?

Шелл, о котором я сегодня повествую, называется Z-shell, или zsh. Zsh является развитием шелла Корна (ksh), который является развитием bash. (АПДЕЙТ: Предыдущее утверждение, как было замечено многими читателями, является неправильным. ksh существовал до bash’а, то есть bash был вдохновлён ksh’ем. Я просто прошёлся по спискам возможностей и понял, что современный ksh значительно более могуч, чем bash, тем самым доказывая именно такие отношения. Я оставлю это утверждение, потому что его изменение может «плохо выглядеть»). Это один из самых мощных шеллов, который только Вы можете захотеть, я даже пойду дальше — я скажу, что каждый может получить что-то от использования zsh. Особенно если Вы уже привыкли к bash или дефолтному шеллу вашей ОСи, я настоятельно рекомендую Вам попробовать zsh! Что мне в нём нравится?

  1. Ведёт себя поразительно схоже с bash. Вы можете использовать zsh точно так же, как Вы использовали bash и не учить ничего нового, и даже это будет улучшением! Совместимость со знакомыми шеллами очень важна. Переход с bash на zsh не будет похож на переход с GEdit на vim. Вы тотчас окажетесь дома, где все Ваши bash’евские сокращения и команды будут работать, как и ожидалось, но Вы также получите доступ к преимуществам zsh. Если Вы — поклонник шелл-скриптинга, Вы будете рады узнать, что синтаксис скриптов zsh также по большей части обратно совместим с bash.

  2. Исправление опечаток. Как часто Вы набирали что-то вроде aptg-et? Если я делаю это в zsh, я получаю сообщение, спрашивающее: «zsh: correct ‘aptg-et’ to ‘apt-get’ [nyae]?». Магия, не правда ли? Это исправление также применяется к любым параметрам, путям и именам файлов, которые Вы набираете.

  3. Феноменально умная система дополнения по TAB. Погодите… Я слышу, Вы что-то говорите. “Ты идиот, bash тоже может это! Тебе всего лишь нужно раскомментировать/проинсталлировать bash-completion.” Нет, это не то, что я имею в виду. Может ли Ваш bash:

    Если Вы можете ответить «да» на один из этих вопросов, пожалуйста, дайте мне знать! Потому что за три года использования мой bash точно не мог этого!
  4. Обмен историей между сессиями. Несколько одновременно запущенных сессий zsh могут обмениваться историей друг с другом вместо того, чтобы мешать друг другу. Одной из наиболее разочаровывающих вещей для пользователя bash является набор длинной команды и последующий её поиск при помощи ctrl+r лишь для того, чтобы найти пустоту.
  5. Встроенный пейджер. Я ленив. Думаю, Вы тоже. zsh поставляется с пейджером, встроенным прямо в шелл. Это значит, что Вы можете набрать что-то вроде <README и это будет эквивалентно less README или cat README | less
  6. Более мощный глоббинг. Глоббинг — это термин для «шаблонов на стероидах» — Ваших выражений вроде «.c», «OfficeS03E[0-2][0-9].avi» и так далее. Как показывает «Введение в zsh», zsh предоставляет Вам значительно более мощные выражения. Вы будете очень редко нуждаться в использовании find или поисковой тулзе с GUI.
  7. Более терпимый язык скриптов. Если Вы не шелл-скриптер, Вы, наверное, не поймёте, о чём я говорю, но для вас, шелл-скриптеры, я скажу вот что: скажите «пока» всем эти bash’евским извращениям. Сколько раз Вы сталкивались с ошибкой в выражении вроде [ $FOO = $BAR ] из-за того, что FOO или BAR были пусты, и Вам приходилось прибегать к глупым уловкам вроде [ x\(FOO = x\)BAR ]? В общем, zsh спасёт Вас от этого при помощи выражений с двойными квадратными скобками. [[ $FOO = $BAR ]] всегда будет работать, а [[ $FOO && $BAR ]] выглядит значительно более естественно, чем [ $FOO -a $BAR ]. Я не могу показать Вам и сотой части мощи zsh в области программирования, но я призываю Вас дать ему шанс!
  8. Многое другое. Не забывайте, я тоже начинающий. Я только сбил верхушку айсберга. Консультируйтесь с прекрасной документацией zsh (я дам ссылку на неё чуть позже), чтобы узнать о zsh всё, что хотите.

Ладно, Вы меня убедили. Как мне начать использовать zsh?

Отлично! Рад, что Вы решили дать ему шанс. К сожалению, zsh не станет делать всего того, что я описал выше, сразу же после установки. Он даже немного безвкусен в дефолтном состоянии. Два года назад я, услышав кое-что о zsh, поставил его и попробовал «зажечь»; первой мыслью было «Что за говнянистая вещь? Тут нету даже дополнения по tab! Я возвращаюсь на bash.» Для того, чтобы заставить zsh делать магические вещи, Вам следует отконфигурировать его при помощи файла с именем .zshrc. Это аналог bash’евского .bashrc или .cshrc для csh (который, кстати, не является городом в Боснии). Большинство людей добывают этот файл, погуглив «zshrc» и используя чужой конфиг к качестве примера. Ну, некоторые из штуковин, используемых в моих zshrc, я тоже нагуглил или взял из конфига Mako, так что я ни в коем случае не претендую на права на эти решения. Ладно, начнём:

  1. Установите zsh с помощью средств своего дистрибутива. По возможности Вам следует использовать пакетный менеджер (yum, apt-get, Synaptic, Portage, fink — Вам видне), потому что zsh с высокой вероятностью уже присутствует в Вашем дистрибутиве в виде пакета. Вообще-то пакетов два — zsh и zsh-devel или zsh-beta. Бетапакет новее и содержит больше возможностей и разработок, но также может содержать баги. Лично я использую беты, там пока что есть проблемы, но выбор зависит только от Вас. Оба варианта работают отлично.

  2. Найдите zshrc. Вы можете погуглить и составить свой, или начать с моих:

    • Linux: Это стандартный zshrc, который я использую на моих Linux машинах. Я юзаю Ubuntu, но я не помещал в конфиг никаких дистроспецифичных вещей.
    • Mac OS X: Почти идентичен варианту для Linux, исключая фиксы режима кнопок delete, Page Up, Page Down, Home и End, а также специальную цветовую схему — чёрный текст на белом фоне — для приглашения командной строки (лично я считаю, что она хорошо смотрится на моём макбуке)

    Этот файл должен быть сохранён в ~/.zshrc; то есть это файл с именем «.zshrc» в Вашей домашней директории.

  3. Наслаждайтесь, читайте документацию, настраивайте шелл так, как Вашей душе угодно! Пожалуйста, сходите на домашнюю страницу zsh и почитайте тамошние доки о советах и уловках. Я новичок с zsh — я не могу научить Вас многому, потому что я сам пока что только учусь.

Дополнительные источники информации

Если Вам понравилась идея, но у Вас вопросов ещё больше, чем было, пожалуйста, загляните на эти чудесные сайты:

P.S. Избегайте соблазна провести всю следующую неделю взаперти, играясь с zshrc. Это на самом деле вредно для здоровья… (Кстати, может ли имя хоста быть оформлено цветом с помощью $PR_BLUE или $PR_GREEN в приглашении командной строки? Я до сих пор созерцаю это в моём zshrc!)

Примечания переводчика: спасибо sqrrl за вычитку!

Comments (migrated from Blogger)

On 2009-11-11T16:09:22.718+02:00, Анонимный wrote:

Более терпимый язык скриптов. Если Вы не шелл-скриптер, Вы, наверное, не поймёте, о чём я говорю, но для вас, шелл-скриптеры, я скажу вот что: скажите «пока» всем эти bash'евским извращениям. Сколько раз Вы сталкивались с ошибкой в выражении вроде [ $FOO = $BAR ] из-за того, что FOO или BAR были пусты, и Вам приходилось прибегать к глупым уловкам вроде [ x\(FOO = x\)BAR ]? В общем, zsh спасёт Вас от этого при помощи выражений с двойными квадратными скобками. [[ $FOO = $BAR ]] всегда будет работать, а [[ $FOO && $BAR ]] выглядит значительно более естественно, чем [ $FOO -a $BAR ]. Я не могу показать Вам и сотой части мощи zsh в области программирования, но я призываю Вас дать ему шанс!

т.е. усугубить несовместимость диалектов шелла?

On 2009-11-11T17:24:00.224+02:00, muhas wrote:

имя хоста конечно может быть оформлено в любом цвете

%m - имя хоста
(цвета из модули color)
%{$fg_bold[grey]%}%m%{$reset_color%} будет выводить в приглашении жирным серым имя хоста, собственно всё так же как и не для имени хоста

ps. Анонимус, да в некоторых случаях несовместим - но в большинстве случаев просто выглядит как расширение баша..

On 2009-11-11T17:28:25.127+02:00, Programmaster wrote:

По-моему, здесь нечему удивляться — разработчики решили упростить скриптерам жизнь. Другое дело, что пример неудачен — двойные квадратные скобки есть и в bash (уже есть — появились в третьей версии, насколько я знаю).
Ну и волноваться по этому поводу не стоит — ну можно и на zsh писать скрипты, ну и что? Я, например, использую zsh, но скрипты как и писал так и пишу в bash. Никто же не заставляет «скриптовать» именно на zsh'е…

On 2009-11-11T23:13:00.624+02:00, proton wrote:

Поругаю zsh:

bash: emerge =opera-10.01 - работает

zsh: emerge =opera-10.01 - zsh: opera-10.01 not found

zsh: emerge “=opera-10.01” - работает

PS: если не понятно - проблема в использовании символа ‘=’

On 2009-11-12T11:22:08.915+02:00, muhas wrote:

proton, man zsh
строка 209 раздел COMPATIBILITY

setopt NO_EQUALS и получаем повеение как в баше

echo =bla 
zsh: bla not found
а теперь
setopt NO_EQUALS
echo =bla
=bla

On 2009-11-12T11:23:29.507+02:00, muhas.ru wrote:

и таки да, ты поругал скорее своё незнание zsh нежели сам zsh _

On 2009-11-12T11:38:10.545+02:00, proton wrote:

Да, я и не спорю)
Спасибо за совет

On 2009-11-12T20:27:48.575+02:00, virens wrote:

При дополнении показывать подсказки практически мгновенно даже для сложных команд, без ужасных bash'евских задержек вроде «Ох, ох, мне нужно набрать ещё пару символов!»?
Круто. Кстати, есть такая утилита, как wcd - пишешь кусочек названия директории и жмёшь ентер. Тут же попадаешь в эту директорию. А в zsh такое есть? /* автор вопроса не холиварит, а просто интересуется.

Наслаждайтесь, читайте документацию, настраивайте шелл
* одобрительные возгласы, аплодисменты и крики из зала “Даёшь!” :-)

Хочется продолжения серии и поста с описанием наиболее сочных настроек zsh с подробным описанием (и листингом zshrc для наиболее горячих парней). А то читать документацию того… лениво…

И да, перевод безупречен. Ломаю шапку.

On 2009-11-12T20:42:52.605+02:00, Programmaster wrote:

Круто.
Понял сам - объясни младшим :)
Ни я сам, ни кто-либо на welinux'е это предложение так и не допёр - я вот лично сравнивал, что bash, что zsh при одинаковом количестве набранных символов дополняют одинаково быстро и верно. Что всё-таки имел в виду автор? %)

Кстати, есть такая утилита, как wcd - пишешь кусочек названия директории и жмёшь ентер. Тут же попадаешь в эту директорию. А в zsh такое есть?
Звучит вкусно, хехе, а вот есть ли — не знаю. Думаю, сейчас muhas подтянется и подскажет ;) Из вкусностей, связанных с директориями, только про auto cd помню — можно перед путём не писать cd.

А ещё есть суффиксальные алиасы - это вообще офигенная штука. Делаешь: alias -s pdf=evince, после чего всё, что заканчивается на “pdf”, будет открываться с помощью evince (команда вида path/to/some/dir/file.pdf будет разворачиваться в evince path/to/some/dir/file.pdf). Но это уже из другой оперы :)

On 2009-11-12T21:27:55.459+02:00, Programmaster wrote:

Ой-ой, что-то не ту кнопочку нажал. Не да ладно, будет два комментария подряд :)

Касательно чтения документации — я свой zshrc пилил довольно активно недели две. Выглядело примерно так: открываешь на dotfiles.org (хороший был ресурс, жаль, что помер) список всех zshrc и перебираешь по одному. Увидел какую-то новую опцию или любопытную функцию — почитал мануал, выяснил, что оно такое. Если понравилось — спёр к себе :) Таким вот образом сколотил себе шелл поудобнее баша, так до сих пор и пользуюсь.

Листинг своего zshrc покажу не ранее, чем в конце следующей недели — опять забрался далеко от своего любимого десктопа :( Может быть, накатаю таки статью — посмотрим. Название, по крайней мере, уже придумал :D

Это, кстати говоря, первая моя попытка что-то перевести и народу показать. Как ни странно, первый блин совсем не комом :) Надо ещё welinux'овский вариант поправить, а то пока для блога форматирование правил, несколько неудачных мест поправил.

On 2009-11-12T21:31:28.007+02:00, Programmaster wrote:

P.S. И да, чуть не забыл — благодарю всех за комментарии!
Извините, что не писал ничего в последнее время (хотя от меня и раньше не очень часто что-то было слышно) — я тут студентом заделался, как-то совсем не до блога было. Зато успел поднакопить идеек для пары постов, а вот ещё virens подбрасывает, так что ждите ;)

On 2009-11-13T06:59:16.513+02:00, andrey i. mavlyanov wrote:

все эти альтернативные шеллы… это прекрасно.

я сам пользуюсь иногда zsh.

но всегда надо помнить - это не стандартное решение и всегда есть вероятность того что “любимый” шелл не будет установлен в системе где необходимо работать.

так что альтернативы это хорошо, но стандартные вещи надо знать и уметь использовать.

On 2009-11-16T16:08:44.313+02:00, muhas.ru wrote:

так что альтернативы это хорошо, но стандартные вещи надо знать и уметь использовать.
на стандартизированном posix sh в вакуме не работает почти нифига из интерактивности (даже баш без пакета с дополнениями намного интерактивнее этого стандартного шела), а так почти тот же zsh,

Думаю, сейчас muhas подтянется и подскажет ;)
а не подскажет ибо сам не знает. хотя надо посмотреть на wcd - но что это я не знаю где на него посмотреть

On 2009-11-16T18:15:51.374+02:00, Programmaster wrote:

2 andrey i. mavlyanov
дык никто же и не требует заменять sh на zsh :) Просто в повседневной работе хочется автоматизации рутины, чтобы поменьше пальцами работать — вот тут zsh как раз к месту.

2 muhas
в Debian wcd представлен отдельным пакетом, думаю что в арче так же. На всякий случай — вот тут описание дебиановского пакета, там же и домашняя страница указана.

On 2009-11-17T14:36:15.492+02:00, muhas.ru wrote:

@Programmaster не понял связи между zsh и wcd - собери её и она будет работать в zsh так же как и в bash - не вижу связи =)

а вот коректировка путей и комманд в zsh может рассматривать как некое подобие wcd - предлагает заменить путь на более похожий

блин wcd уже минут 10 пишет мне Wcd: Please wait. Scanning disk. Building treedata-file from /home/muhas
(в арче кстати нет такого пакета даже в аур, собрать я его собрал только эта сволочь плевать хотела на DESTDIR и собрала как wcd.exe =))

On 2009-11-17T15:03:02.346+02:00, Programmaster wrote:

2 muhas
не понял связи между zsh и wcd - собери её и она будет работать в zsh так же как и в bash - не вижу связи =)
А кто говорил, что связь есть? Я эту программу ни разу не видел и не юзал, впервые узнал о ней из комментария virens'а выше. В конце недели вернусь наконец за свой Linux десктоп — поковыряю. Хотя можно и здесь (на win-машине сестры) под cygwin попробовать…

On 2009-11-18T11:06:27.943+02:00, virens wrote:

Звучит вкусно, хехе, а вот есть ли — не знаю. Думаю, сейчас muhas подтянется и подскажет ;)
Мухас подтянулся, но остроты диспуту это не прибавило. А жаль :-)

Выглядело примерно так: открываешь на dotfiles.org (хороший был ресурс, жаль, что помер) список всех zshrc и перебираешь по одному. Увидел какую-то новую опцию или любопытную функцию — почитал мануал, выяснил, что оно такое. Если понравилось — спёр к себе :) Таким вот образом сколотил себе шелл поудобнее баша, так до сих пор и пользуюсь.
У тебя там что, патентованные комментарии, или майкрософтовский код? :-) Раз зажёг народ на zsh - давай уж дожигай и выкладывай конфиг для самых нетерпеливых.

Насчёт внеших сайтов по хранению конфигов - это зло на мой взгляд. Грохнется такой сайт и что? Я лично все конфиги постю только в самом блоггере - если уж ОН грохнется, то…

@Мухас
а не подскажет ибо сам не знает. хотя надо посмотреть на wcd - но что это я не знаю где на него посмотреть
Пользуясь случаем, пропиарю коллегу : про wcd написано с потрясающей художественной силой. Отобрал у меня пост. Молодёжь наступает, однако :-)

И ещё, Саш, вот на это:
В конце недели вернусь наконец за свой Linux десктоп — поковыряю. Хотя можно и здесь (на win-машине сестры) под cygwin попробовать…
… но USB-бутявки рулят со страшной силой и делаются совсем не так долго (извини за пиар).

Ну и традиционно аплодисменты автору.

On 2009-11-18T15:49:36.010+02:00, Programmaster wrote:

У тебя там что, патентованные комментарии, или майкрософтовский код? :-)
/me поплевал через левое плечо три раза
Упаси Торвальдс!

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

Насчёт внеших сайтов по хранению конфигов - это зло на мой взгляд. Грохнется такой сайт и что? Я лично все конфиги постю только в самом блоггере - если уж ОН грохнется, то…
Ну на блоггере это надо уже будет оформлять как пост :) На dotfiles же залил и всё. К тому же там была удобная навигация. Хотя вобщем-то ты прав, уж если блог есть, то почему бы и не сюда?

USB-бутявки рулят со страшной силой и делаются совсем не так долго (извини за пиар).
Да, рулят, но я в пятницу уже увижу свой родимый десктопик :) Так что вроде как уже поздно — два дня я как-то уж перетерплю.
Хотя надо бы себе сделать что-то такое, а то в следующий раз опять буду скучать и хныкать :)
А о пиаре не беспокойся — ссылка на твой блог и так в «Полезных блогах» висит ;)

On 2009-11-20T15:08:29.178+02:00, muhas.ru wrote:

Пользуясь случаем, пропиарю коллегу : про wcd написано с потрясающей художественной силой. Отобрал у меня пост. Молодёжь наступает, однако :-)
да я посмотрел уже, казалось что это сказано в контексте что работает только в баше - вообще я сначала и подумал что это пероготива баша, ан нет, даже же виндовом cmd работает =)

как-то неудобно на блоггере за комментами следить :(

On 2009-11-20T20:02:03.824+02:00, Programmaster wrote:

как-то неудобно на блоггере за комментами следить :(
Увы и ах — подписка на комменты по email доступна только если у тебя есть Google/Blogger аккаунт. Тогда под редактором комментария появляется ссылка «Подписаться по электронной почте».

P.S. Поменял стиль редактора комментариев на встроенный, потому что подписка возможна только оттуда (по крайней мере, в предыдущей версии я такой возможности не нашёл).

P.P.S. Я наконец-то за своим Linux десктопом — на днях будет пост про ZHS с примерами конфигов! :)

On 2010-03-15T10:28:33.937+02:00, Анонимный wrote:

> Выглядело примерно так: открываешь на dotfiles.org (хороший был ресурс, жаль, что помер) список всех zshrc и перебираешь по одному.

Вот старый .dotfiles. Архивная версия.

On 2011-02-15T22:54:18.544+02:00, gvy wrote:

> Он даже немного безвкусен в дефолтном состоянии.
Это в деб***ане – например, в альте он вполне адекватен из коробки.

См. тж. http://www.altlinux.org/DotFiles/Shells/Zsh

Drop me a line! (wonder where’s the comments form?)