Zsh и мифы о нём

Алексей Федорчук

Вокруг командной оболочки Zsh линуксоидами создано не намного меньше легенд и мифов, чем древнеримскими греками — вокруг Троянской войны. И столь же тесно мифы эти и легенды сопряжены с типичной подменой понятий, когда тёплое смешивается с мягким, а интерактивное со скриптовым. Ибо, как «Илиада» описывает один из эпизодов осады города Илиона (который настолько не совсем Троя, что совсем даже не она), так и от прочтения всяких сетевых материалов про Zsh складывается впечатление, что говорят о какой-то другой оболочке, вовсе не той, с которой её применители имеют дело изо дня в день.

Легенды и мифы эти столь стары, что давно превратились в предрассудки. Например, многие годы по сети кочует фраза, до первоисточника которой мне так и не удалось докопаться:

По возможностям zsh больше всего похож на ksh.

Это — первый миф. Потому что Zsh похож на Ksh не более, чем Bash, Ash или Dash. А, как все перечисленные оболочки, с ним совместим. И было бы странно, если бы было иначе: всё это — оболочки, совместимые со стандартом POSIX Shell, при разработке которого за основу был принят именно шелл Корна.

И, раз уж зашла речь о совместимости. Бытует мнение, что Zsh отягощён совместимостью с Csh и Tcsh. Однако тягот тут нет ни малейших. Просто те, кто привык к синтаксису C Shell’а, могут использовать его в своих пользовательских конфигах и скриптах. А могут — не использовать, никто не неволит их это делать. Подобно тому, как обладательниц прокладок (не помню каких) вовсе не заставляют прыгать с парашютом или нырять с аквалангом.

Второй миф как раз и касается скриптов: якобы Zsh не подходит для их сочинения. С этим трудно спорить: для этого он подходит не больше, чем ГТТ — для гонки по автострадам. Потому что как тот, так и другой создавались для совершенно других целей: ГТТ — для езды в отсутствии дорог вообще, Zsh — для интерактивной работы в CLI.

И тут надо заметить, что Bash изначально тоже задумывался как оболочка для интерактивной работы. Хотя в «чистом» виде её возможности в этом плане достаточно ограничены: значительная часть интерактивного функционала Bash’а обеспечивается дополнительными пакетами readline и bash-comletion. Правда, они в большинстве дистрибутивов они устанавливаются вместе с Bash автоматически. Однако, во-первых, это бывает не всегда. А во-вторых, даже с ними в интерактивном режиме возможности Bash по сравнению с Zsh выглядят как джип супротив ГТТ — в тундре.

Что же до скриптинга — для Zsh сочинять скрипты, конечно, не возбраняется, однако — для работы в пределах одной отдельно взятой машины (или серии машин в руках одного хозяина). В произвольной машине Zsh может или отсутствовать как класс, или быть настроен несколько иначе, и последнее иногда отражается на выполнении сценариев оболочки (вплоть до их невыполнения). С чем связан ещё один миф — что Bash для целей скриптинга подходит больше.

Но тут всё дело в том, что действительно Bash на произвольной Linux-машине, скорее всего, будет — и, скорее всего, настроенным «из коробки» примерно одинаково (то есть почти никак). Однако это не является каким-то достоинством самой оболочки, а только данью традиции. И имеются в природе дистрибутивы Linux’а, которые этой традиции не следуют (например, Tiny Core Linux, в котором роль системной командной оболочки исполняет Ash). А уж ожидать встретить Bash установленным в произвольной BSD-системе было бы вообще опрометчиво.

Так что на самом деле единственный по настоящему универсальный инструмент для скриптинга — эвентуальный POSIX Shell, обычно представляющийся как /bin/sh. Практическими же его воплощениями являются Ash и его Debian-модификация Dash. Именно такой подход последовательно провидится в дистрибутивах семейства Ubuntu: ни в одном из них системные сценарии из каталога /etc/ не содержат ша-банга

#!/bin/bash

Вместо него в первой строке везде фигурирует /bin/sh, который является символической ссылкой на /bin/dash.

Ещё один распространённый миф — что Zsh это улучшенная версия Bash, контаминированная с возможностями Csh. Однако если обратиться к истории, становится ясно, что в 1990 году, когда Пауль Фальстад (Paul Falstad) сочинял первую версию Zsh, Bash’у от роду едва стукнул годик, и заимствовать из него было ещё особо нечего. А вот из оболочки TENEX C Shell, обладавшей тогда самыми развитыми интерактивными возможностями, заимствовано было многое. Так что Zsh скорее можно считать результатом адаптации Tcsh на предмет совместимости с POSIX Shell. Хотя совместимость с конфигами Csh/Tcsh была сохранена «из уважения к памяти предков» .

И последний миф, на котором я сегодня остановлюсь — о какой-то сверхъестественной сложности конфигурирования Zsh по сравнению с Bash, который якобы «правильно» настроен «из коробки». Во-первых, изначальная настроенность последнего, мягко говоря, несколько преувеличена — по умолчанию она не предусматривает даже такой банальной операции, как рекурсивное копирование (без опции -i).

Во-вторых, при первом запуске Zsh как login shell предлагается запустить сценарий автоматического конфигурирования этой оболочки, завершающийся созданием файла ~/.zshrc, который будет включать все необходимые данному применителю опции.

И в-третьих, эффективное применение Zsh вовсе не требует каких-то страшных конфигов в сотни (а то и тысячи) строк, отыскивания их в сети или, тем более, пребывания завсегдатаем сайта Oh My ZSH! — хотя всё это и не вредно. На самом деле достаточно знать об основных уникальных фичах этой оболочки в интерактивном режиме, таких, как глобальные псевдонимы, расширенное и множественное перенаправление, расширенное автодополнение etc. А уж если ощутить в них потребность — то включить соответствующие опции в своём личном конфиге будет делом несложной техники.

А отказаться от интерактивных функций Zsh после их освоения будет психологически невозможным. Во всяком случае, я не знаю ни одного применителя этой оболочки, который не испытывал бы дрожи при одной мысли, что враги народа заставят его работать в Bash’е.

Именно поэтому командная оболочка Zsh была принята в системе Cintu как пользовательская регистрационная (login shell) по умолчанию. А, дабы её можно было эффективно использовать «из коробки», она сопровождается здесь конфигурационным файлом ~/.zshrc (и его пополняемым онлайновым описанием). В этом конфиге задействована изрядная часть (ИМХО) полезных интерактивных функций Zsh, в том числе и интеграция с менеджером пакетов apt. Что, конечно, не запрещает применение этого конфига в любом другом дистрибутиве семейства Ubuntu. А, за вычетом строк, специфических для deb based систем — и в любой UNIX-подобной системе вообще.

Zsh и мифы о нём: 5 комментариев

  1. вот как хотите а обычному пользователю абсолютно на zsh как большой колокольни ибо не пользуется он ей…
    ему (пользователю) нужен быстрый и отзывчивый рабочий стол да набор программ (желательно без глюков) и пару раз в год в отпуск на море — но не zsh точно…
    если уж zsh задумывается как изюминка CintU то имеет смысл создать готовый конфиг с подробным описанием опций и как что и куда кидать чтобы железно работало — я за сегодня только трижды ставил CintU на реальное железо и всё пашет! вроде… но уже есть большое НО с выключением системы (надеюсь только у меня) GUI которой заявило «точно вырубаем» и не предоставило даже намёка на нажатие «ОК», только «отмена» и всё!
    впрочем, глюки и непонятки бывают у всех:) сборка от ualinux с циннамоном вообще после установки обнов загрузила unity и была такова :) не ну я просто в шоке был — три часа ставил, настраивал и тут такой косяк :)
    теперь я начинаю понимать почему среднестатистический пользователь предпочитает установить сборку с unity или xfce — он получит ожидаемый результат и плевать ему на потребление памяти или наличие той или иной программы в комплекте, ему важна стабильность и предсказуемость результата.
    прошу пардону за оффтоп

  2. Den, я думаю, Вы не очень удивитесь, если я скажу, что мне на пользователя, предел мечтаний которого — отпуск на море два раза в году — с ещё более высокой колокольни.
    Конфиг ~/.zshrc в системе имеется, и довольно подробно прокомментированный. Ну и ещё более подробные комментарии — в материалах по ссылке в конце статьи, постепенно пополняемых.
    А вот на счёт выключения — у меня ни в одной сборке ни на одной машине никаких проблем с этим не было, появлялась панель с четырьмя кнопками, которые реагировали адекватно.
    На счёт Xfce — хороший десктоп, да, но уж больно скучный. Unity же своим видом оскорбляет моё эстетическое чувство, а своей конфигурируемостью — мой здравый смысл: кажется, меньше чем через четыре утииты там ничего не сконфигурировать.

  3. завтра пришлю скрин про выход из системы.
    просто так и не понял как вылечить эту заразу…

  4. Установила cintu-midi-16041-3ts на нетбук Asus.
    Проблем с выключением системы не наблюдается.
    Но с включённой по умолчанию командной оболочкой Zsh сценарии в Nemo не видимы и соответственно не работают. Я так привыкла к их применению в Matuntu.

  5. А если сделать login shell — bash? Работают?
    У меня как-то пока не было необходимости подключать к Nemo сценарии. Надо что-то придумывать для пробы :)

Добавить комментарий