Немало дискового пространства [1] извел я на тезиса о несравненных достоинствах командных сред в текстовой консоли, сиречь shell'ов. Пора обратиться к вопросу – а какой же из всех этих замечательных shell'ов лучший?
Рискну предположить, что подавляющее большинство пользователей Linux'а используют в качестве командной среды не что иное, как bash – и при этом не жалуются. В BSD-системах более принят csh (вернее, его свободный клон tcsh – я в нем сам работаю, и вреда – ни малейшего). Вполне вероятно, что кто-то предпочитает /bin/sh из FreeBSD (римейк классического shell'а Борна) – из соображений экономии ресурсов. Или – столь же аскетичный ash, помещаемый обычно на resque-дискеты Linux.
А вот о чем слышать не доводилось – так это об использовании оболочки Корна (ksh), даже в ее public domain модификации (pdksh). Хотя стандарт POSIX 1003.2 на переносимые оболочки Unix, к коему апеллируют адепты sh-образных командных сред, именно из нее позаимствовал большинство своих «продвинутых» (то есть выходящих за рамки исходного Борновского shell'а) особенностей – историю команд, редактирование командной строки и переопределение его режимов, автодополнение и т.д., без чего ныне работа в командной строке Unix если и мыслима, то – с трудом.
Конечно, идеи большинства этих функций имеется и в csh, а в tcsh – так даже и прекрасная их реализация. Однако в силу особенностей синтаксиса ни та, ни другая среда даже не претендуют на совместимость с POSIX-стандартом.
И потому для меня было весьма интересно ознакомиться с оболочкой, аккумулирующей, по словам Андрея Шевеля [2], полезные свойства развитых сред типа bash, tcsh и pdksh. Имя ей – zsh. Которое я, применительно случаю, интерпретировал бы как финальную точку в shell'остроении, звездный момент последнего (или, по простому, звездеZ).
Сразу замечу – некоторые основания для такой интерпретации имеются. Действительно, zsh с точки зрения синтаксиса командного языка принадлежит к семейству shell'ов Борна, то есть может претендовать на некоторую совместимость со стандартом. Далее, она имеет все стандартные для современных полнофункциональных оболочек возможности интерактивной работы, как то:
Конечно, всем этим трудно удивить приверженца bash или tcsh. Однако в ней есть и кое-что еще. Например, спеллинг командной строки. Конечно, и это само по себе не уникально. Однако проверка правильности ввода и автокоррекция в zsh распространяются не только на встроенные (как в bash) и даже внешние (как в tcsh) команды, но даже на пути и аргументы. Автодополнение само по себе – тоже не бог весть какое новшество. Однако приятная неожиданность в zsh – то, что оно действует также и на аргументы команд, как и вывод возможных для дополнения вариантов: чтобы просмотреть man-страницы по zsh (а их насчитывается дюжина), достаточно набрать
man zsh
нажать Control+D – и выбрать из предложенного требуемую «маню»:
manual page zsh zshcompctl zshcontrib zshmodules zshzftpsys zshall zshcompsys zshexpn zshoptions zshzle zshbuiltins zshcompwid zshmisc zshparam
Да и подсказка при выводе вариантов пополнения – дорогого стоит: она объясняет, что среди предложенного является каталогом, что – регулярным файлом, что – командой, встроенной или внешней.
Использование псевдонимов (alias) также вошло в быт: куда как проще раз и навсегда определить в профильном файле команду ls как псевдоним самой же себя, но с опциями -FG, нежели каждый раз вспоминать, как отличить в ее выводе каталоги от обычных файлов. Однако в zsh это дополняется возможностью определения псевдонимов для командных конвейеров в форме опций. Задав такой, скажем, в форме
alias -g L='|less'
и указав его в качестве флага после команды ls, мы автоматом получаем в ответ постраничный вывод результатов просмотра каталога.
О редактировании командной строки говорить, казалось бы, нечего: это давно уже общее место всех оболочек, претендующих на развитость. Однако zsh и тут отличился – по количеству клавишных комбинаций для навигации по строке и ее изменению (как посимвольному, так и целыми командными «словами») он оставляет позади и bash, и tcsh. Приятно при этом, что принцип построения их (в отношении сочетаний с клавишами Control и Meta), а сами последовательности для наиболее частных действий (типа Control+C, Control+Z, Control+H/Meta+H, Control+D/Meta+D) обычно совпадают с таковыми и bash, и tcsh. К слову сказать, комбинации Meta+символ-Control+символ (а ими дублируется большинство простых последовательностей) работают и при русской раскладке клавиатуры.
То же и касаемо истории команд – в zsh есть все обычные средства доступа к буферу истории. Плюс – возможность разнообразного вывода списка «исторических» файлов и их перебора спереди назад, из конца в конец и вдоль и поперек.
А уж что касается встроенных команд – здесь за zsh просто абсолютный рекорд – их более 80 (дальше я, честно говоря, сбился со счета). Имеется, конечно, и полный набор условных и циклических операторов. А если обратить внимание на то, что zsh допускает возможность подключения дополнительных модулей (типа plug-ins), коих только в комплекте идет пара десятков – думаю, последние сомнения в функциональности этой оболочки отпадут.
В подтверждение своего соответствия стандартам zsh способен эмулировать также оболочки Борна и Корна – для этого исполняемые их файлы должны быть символическими ссылками на ~/bin/zsh. В этом случае продвинутые возможности самого zsh, конечно, остаются за кадром, но зато отпадает необходимость задумываться о совместимости. Есть в zsh и нечто вроде режима совместимости с оболочками семейства csh.
Выше всяких похвал возможности настройки zsh. На сей предмет в нем предусмотрено аж пять основных дот-файлов (их нужно вручную скопировать в домашний каталог из ~/examples), из которых ~/.zshenv и ~/.zshrc считываются при любом запуске оболочки, а ~/.zprofile и ~/.zlogin – в том случае, если она является первичной для пользователя (login shell).
В первом из указанных файлов определяются основные переменные среды, такие, как пути поиска исполнимых файлов. В ~/.zshrc задаются псевдонимы для команд и конвейеров, подключаемые модули, настраивается вид приглашений командной строки. В файле ~/.zprofile можно задать такие пользовательские переменные, как редактор, pager, терминал [3]. Наконец, в ~/.zlogin указываются действия, непосредственно предшествующие выводу приглашения – например, всякого рода полезные сообщения (или, напротив, очистка экрана от предшествующих сообщений системы). Действия при выходе из zsh описываются в файле ~/.zlogout.
Такая многоступенчатая схема конфигурирования может показаться неоправданно сложной. Однако она позволяет очень гибко управлять переменными оболочки и среды в различных условиях.
И в заключение – о том, что покорило меня в zsh с первого на него взгляда.Это – настройка вида приглашений командной строки. Мало того, что здесь предусмотрено четыре их уровня – от PROMPT до PROMPT4 (или PS1-PS4, допустимы обе формы): различный вид первичного приглашения, приглашения при вводе многострочных команд и т.д. обычен и для bash (или, в меньшей мере, для tcsh). Однако в zsh есть и приглашение, используемое при спеллинге (SPROMPT), и даже приглашение, дополнительно выводимое в правой части первичной командной строки (RPROMPT).
В качестве приглашений могут использоваться:
Плюс к этому приглашения могут быть оформлены визуально различными видами: выделением жирным шрифтом (boldface mode) или повышенной яркостью (underline mode), инвертированием цветов (standout mode). Все это позволяет добиться максимальной информативности приглашения и его внешней выразительности.
Меня всегда удивляло, почему обычно по умолчанию в большинстве случаев в приглашении командной строки выводится имя пользователя или хоста: не так уж часто приходится работать в том состоянии, когда не помнишь не только где находишься, но и кто ты есть. Гораздо полезней видеть путь к текущему каталогу и номер виртуальной консоли, а также – не забыл ли ты случайно выйти из режима администратора после монтирования zip-диска. И zsh способен сполна удовлетворить такие претензии…
В настоящей заметке я осветил лишь часть возможностей оболочки zsh [4]. остается добавить только, что автор ее первоначального варианта – Пауль Фальстад (Paul Falstad), прописана она на сайте http://www.zsh.org и входит во все известные мне полномерные дистрибутивы Linux, во Free- и OpenBSD (как в виде порта, так и пакета).
[1] См., например, серию заметок
под общим именем «Апология консоли»:
http://www.softerra.ru/freeos/10274/
http://www.softerra.ru/freeos/10700/
http://www.softerra.ru/freeos/10759/
[обратно
к тексту]
[2] Андрей Шевель. Linux. Обработка текстов. Специальный справочник. СПб: Питер, 2001, с. 60. [обратно к тексту]
[3] Кстати – в ~/examples этого файла нет, его при необходимости придется сделать вручную. [обратно к тексту]
[4] На странице я попробовал дать краткую справку по настройке zsh и управляющим последовательностям. [обратно к тексту]