Добавить в избранное | Сделать стартовой страницей

Большая Linux библиотека для пользователей OS Linux и ПО для нее
Есть что сказать? Нужен совет? Посети наш форум.


При поддержке
Продвижение сайта
Создание сайта
Администрирование сервера
настройка сервера
Администрирование сервера
настройка сервера
Администрирование сервера
аренда сервера


Еще один великолепный Shell. (Zsh).

Автор : Алексей Федорчук, [email protected]

Немало дискового пространства [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 (как в виде порта, так и пакета).


аренда сайта доли