div.main {margin-left: 20pt; margin-right: 20pt}Еще один великолепный Shell Автор: Алексей Федорчук, alv@newmail.ru Опубликовано:
25.05.2002 Оригинал: http://www.softerra.ru/freeos/18055/
Немало дискового пространства [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 (как в виде порта, так и пакета).
|