В этой статье мы предполагаем, что читатель уже имеет навыки работы с одним из распространенных командных процессоров UNIX и поэтому сосредоточимся на отличительных возможностях Zsh.
Zsh -- командный процессор UNIX, который может использоваться как командный процессор для скриптов, так и интерактивная оболочка. Zsh обладает множеством возможностей, среди которых -- настраиваемый механизм дополнений (completitions), редактирование командной строки, механизм сохранения историй, встроенное исправление неправильных комманд.
По возможностям zsh наиболее сильно похож на ksh, но при этом обладает еще множеством расширений. Свежие версии zsh доступны с сервера www.zsh.org и его зеркал. Кроме этого zsh часто включают в состав популярных дистрибутивов Linux и других вариантов UNIX.
Запуск
Обычно zsh указывают в качестве интерактивной оболочки для входа в систему. Но кроме этого zsh можно запускать с разными ключами, определяющими его поведение. Например, ключ -r заставляет zsh работать в "ограниченном" режиме, ключ -c указывает откуда читать команды для выполнения, а ключ -i заставляет работать в интерактивном режиме.
При работе в "ограниченном" режиме запрещается выполнять некоторые действия: изменять каталог, запускать программы с помощью команды exec, перенаправлять вывод в файлы, изменять значение переменных среды, используемых при запуске программ, а также запускать программы, используя их абсолютные имена. При запуске zsh старается эмулировать sh или ksh, в зависимости от того, под каким именем его запустили. В режиме эмуляции не исполняются обычные скрипты инициализации/завершения работы zsh. Для инициализации используются файлы /etc/profile и $HOME/.profile
Файлы, используемые при запуске
При запуске zsh читается некоторое количество файлов, содержащих команды инициализации. В первую очередь читается файл /etc/zshenv, затем читается файл $ZDOTDIR/.zshenv. Затем, если запускаемый процесс используется для входа в систему, то читаются файлы /etc/zprofile и $ZDOTDIR/.zprofile. Затем, если оболочка является интерактивной, читаются файлы /etc/zshrc и $ZDOTDIR/.zshrc. И наконец, если процесс используется для входа в систему, то читаются файлы /etc/zlogin и $ZDOTDIR/.zlogin.
Когда происходит выход из оболочки, использовавшейся для входа в систему, то читаются файлы $ZDOTDIR/.zlogout и затем /etc/zlogout. Если переменная ZDOTDIR не установлена, то вместо нее используется значение переменной HOME. Файл /etc/zshenv читается при запуске любого процесса zsh, поэтому он должен быть настолько малым, насколько это возможно. Все перечисленные файлы могут быть откомпилированы с помощью команд zcompile. Откомпилированные файлы имеют расширение .zwc, и загружаются в том случае, если они новее исходного файла.
Перенаправление вывода
Zsh поддерживает такое же перенаправление вывода как и bash, но кроме этого он поддерживает множество расширений. Некоторые расширения работают только если заданы соответствующие настройки. Например, если не задана опция CLOBBER, то использование команды > для существующего файла приведет к возникновению ошибки и невыполнению команды. На этот случай, для практически всех команд существуют их модификации, которые не зависят от настроек. Например, для команды > существуют ее модификации >! и >|.
Для одновременного перенаправления стандартного вывода и стандартного потока сообщений об ошибках определены дополнительные команды >&, &>, >>&, &>> и их модификации со знаками | и ! (например, &>|). Эти команды соответственно переписывают и дополняют информацию в указанных файлах. Эти команды позволяют избавиться от неуклюжих конструкций вида 1>FNAME 2>&1.
Zsh также позволяет перенаправлять информацию более чем в один файл, аналогично использованию команды tee (это доступно только если определена переменная MULTIOS, что обычно указано по умолчанию). Кроме этого можно одновременно использовать перенаправление и конвейеры. Например, команда date >foo | cat запишет дату в файл foo и выведет ее в стандартный поток вывода. Если установлена переменная MULTIOS, то имя файла, указанное в качестве того, куда перенаправлять информацию, подвергается раскрытию шаблонов (globbing). Таким образом можно использовать команду : > * для обрезания всех файлов в текущем каталоге.
Множественное перенаправление также работает и при вводе информации, позволяя заменять конструкции вида cat foo fubar | sort на конструкции sort <foo <fubar или даже sort <f{oo,ubar}. Zsh даже позволяет использовать перенаправление без указания команды. Если не установлена переменная NULLCMD, то при таком использовании будет возникать ошибка. Но если установлена переменная NULLCMD, или READNULLCMD (она имеет преимущество над NULLCMD), то эти команды будут использоваться для обработки данных. По умолчанию NULLCMD имеет значением команду cat, а READNULLCMD значением команду more. Таким образом команда < file приведет к показу указанного файла.
Функции
Zsh позволяет пользователю определять собственные функции, которые могут выполняться точно также как и обычные программы. Функции выполняются в том же процессе, что и вызвавшая их программа. При вызове функции аргументы передаются как позиционные параметры.
Для ускорения загрузки zsh может использовать автоматически загружаемые функции, когда они только объявляются, но не считываются. При первом использовании такой функции происходит ее считывание и компиляция. Для объявления автоматически загружаемой функции используется встроенная команда autoload (или ее налоги `functions -u' и `typeset -fu'). Поиск определений функций осуществляется по каталогам перечисленным в переменной fpath.
Кроме обычных функций, zsh позволяет определять функции со специальным значением. Так, например, функция chpwd вызывается при изменении рабочего каталога, а функции precmd и preexec выполняются перед каждым выводом приглашения и перед выполнением считанной команды, соответственно. Кроме того, может быть определена функция periodic, которая может выполняться через каждые $PERIOD (если этот параметр определен) секунд перед выводом приглашения.
Задания
Zsh работает с задачами подобно bash, но при этом имеется возможность более гибко работать с заданиями запущенными в фоновом режиме. Кроме команды &, которая используется для запуска задачи в фоновом режиме, также определены команды &| или &!, которые запускают программу, которая не будет иметь записи в таблице задач и с которой нельзя работать обычным функциями работы с заданиями.
Для ссылки на задания можно использовать специальные переменные: %NUMBER --- для ссылки на задание номер NUMBER (как в bash); %STRING и %?STRING --- для ссылки на задания, чьи командные строки начинаются и содержат строку STRING, соответственно; %% (или %+) и %- для ссылки на текущее и предыдущее задание.
Подстановка переменных
Zsh имеет множество расширений в области различных подстановок. По назначению подстановки можно разделить на две группы: Подстановки в строке приглашения и прочие подстановки. Подстановки в строке приглашения могут использовать функции из группы "прочие подстановки".
Подстановки в строке приглашения
Zsh позволяет пользователю очень гибко настроить строки приглашения командного процессора. Для этого используются различные подстановки. С их помощью можно выделять цветами части текста в командной строке, помещать строку с текущим каталогом в строку окна терминала и многое другое.
Для приглашения командной строки существует разделение на левую и правую часть приглашения. Кроме привычных переменных, таких как PS1 и PS2, также существуют их аналоги, имена которых начинаются с буквы R. Например, это позволяет вынести в правую часть часы, которые показывают время выведения приглашения.
Полное описание всех возможных подстановок для строки приглашения можно найти в справке по zsh.
Темы для строки приглашения
Благодаря возможностям zsh пользователи пишут различные модули расширения. Одним из таких модулей является модуль для установки тем для строк приглашения. Этот модуль загружается с помощью команд:
autoload -U promptinit
promptinit
и позволяет пользователям использовать заранее подготовленные темы для приглашений. Команда prompt -p выдает примеры всех установленных тем строки приглашения.
Прочие подстановки
Все остальные подстановки выполняются в пять шагов, в перечисленном ниже порядке.
1. Сначала выполняются подстановки в истории. На этом этапе подставляются строки из истории, которые соответствуют заданным командам. См. раздел Подстановки истории
2. Затем выполняется раскрытие псевдонимов (алиасов). Раскрытие алиасов выполняется немедленно, до того, как командная строка будет разобрана.
3, Затем выполняется подстановка процессов, параметров, команд, раскрытие арифметических выражений, и затем уже раскрытие выражений в скобках. Каждый из этих этапов подробно описан в справке по zsh.
4. Раскрытие имен файлов. На этом этапе происходит подстановка комбинаций строк и чисел с символом ~. Если используется комбинация с числом, то каталог берется из стека каталогов. Если используется строка, то она
используется как имя пользователя, и вместо сочетания ~ со строкой подставляется домашний каталог соответствующего пользователя.
5. И на последнем шаге происходит генерация имен файлов (globbing). См. раздел Генерация имен файлов
Полный перечень всех шаблонов и настроек вы сможете найти в справке по zsh.
Подстановки истории
Система подстановок истории zsh немного отличается от подстановок истории в командном процессоре bash. В zsh сделано много добавлений, которые позволяют получить доступ к нужным аргументам выполненных команд, а также выполнить разные модификации аргументов.
Подстановки истории zsh позволяют указать какое слово из команды нужно задействовать. Для этого используются следующие указатели слов:
:0 -- первое слово в командной строке
:n -- n-й аргумент
:^ -- 1-й аргумент (аналогично :1)
:$ -- последний аргумент строки
:X-Y -- аргументы с X по Y
:X- -- все аргументы начиная с X кроме последнего
:* -- все аргументы
:X8 -- все аргументы начиная с X (аналогично :X-$)
Кроме этого, в подстановках истории, после указателей слов, можно использовать модификаторы, которые позволяют выполнять различные подстановки в истории. Так, например, модификатор :h работает подобно использованию команды dirname, а модификатор :t работает подобно команде basename. Полный список модификаторов можно получить в руководстве по zsh.
Генерация имен файлов
Zsh предоставляет множество дополнений и настроек по генерации имен файлов.
Операторы глоббинга
Кроме стандартных символов (таких как *, ?, [...]), используемых для генерации имен файлов в других командных процессорах, в zsh определены дополнительные операторы глоббинга, такие как:
^X -- совпадает с любым кроме X. Например, ^*.elc будет соответствовать всем файлам, кроме тех которые указаны в маске (в нашем случае это файлы с расширением .elc).
X~Y -- совпадает со всем, что соответствует шаблону X, и не соответствует шаблону Y. Например, *.el*~*.elc соответствует всем файлам, чье расширение начинается с .el, но при этом не будут учитываться файлы с расширением *.elc.
X# -- соответствует нулю или нескольким вхождениям шаблона X.
X## -- соответствует одному или нескольким вхождениям шаблона X.
Флаги глоббинга
Флаги глоббинга используются для воздействия на шаблон, который стоит правее указанного флага. Все флаги имеют форму (#X), где X определяет нужный модификатор. Ниже приведено описание нескольких флагов, которые могут наиболее часто использоваться в работе:
i -- делает шаблон не зависимым от регистра символов, которые в нем применяются;
l -- заставляет символы в нижнем регистре, которые используются в шаблоне, соответствовать символам и в вернем и нижнем регистре. Символы в верхнем регистре, будут соотвествовать точно тем же символам;
I -- локально отменяет воздействие флагов l и i;
другие флаги, описаны в руководстве по zsh.
Квалификаторы глоббинга
При генерации имен файлов могут использоваться квалификаторы глоббинга, так что пользователь может указывать какие типы файлов будут подпадать под под генерацию имен. Квалификаторы указываются в конце шаблона и заключаются в круглые скобки. Среди квалификаторов есть например,
. для указания обычных файлов
/ для указания каталогов
= для указания сокетов
и многие другие (можно указывать права доступа, времена модификации файлов и т.п.). Их полное описание можно найти в руководстве по zsh.
Рекурсивный глоббинг
zsh позволяет производить рекурсивное раскрытие имен файлов. Для этого используются формы **/ и ***/ Первая форма отличается от второй лишь тем, что не следует по символьным ссылкам. Так, например ls **/foo произведет поиск файлов с именем foo во всех подкаталогах. Эти формы не могут комбинироваться с другими формами в одном шаблоне. При одновременном использовании данных форм с другими, оператор * приобретает свое обычное значение.
???
Кроме вышеперечисленных настроек. zsh также позволяет использовать приблизительное соответствие, пытаясь найти файлы, в именах которых (по его мнению :-) могли бы быть сделаны ошибки.
Параметры и настройки
В zsh различаются параметры и настройки. Параметры используются для передачи и хранения данных, а настройки используются для управления поведением zsh.
Параметры
Каждый параметр имеет имя, значение и набор атрибутов. Имя может состоять из букв, цифр и специальных знаков. Значениями могут быть числа (целые), строки, массивы и хеши (ассоциативные массивы).
Для объявления типов параметров, или присвоения целого или строкового значения параметру, используется встроенная команда typeset. Значения строкового или целого типа могут присваиваться простым приравниванием -- ИМЯ=ЗНАЧЕНИЕ. Для присваивания других типов параметров используется команда typeset.
Позиционные параметры используются для доступа к аргументам командной строки для функции или скрипта командного процессора. Специальные параметры *, @ и argv являются массивами, которые содержат все позиционные параметры. Позиционные параметры могут быть изменены после запуска скрипта или функции с помощью встроенной команды set.
Настройки
Настройки устанавливаются с помощью встроенной команды setopt, а удаляются с помощью команды unsetopt.
Дополнения (completitions)
Дополнения обеспечивают набор строки за вас. Оно может быть в разных формах, но для его выполнения (обычно) используется клавиша TAB.
В zsh дополняться может все что угодно: имена и пути файлов; имена встроенных и внешних команд, а также их ключи; имена переменных среды; имена пользователей и компьютеров, а также многое другое. zsh имеет в своей поставке некоторое количество определений дополнений для основных программ операционных систем.
Существует несколько форм задания дополнений в командной строке. Ниже приведены краткие описания этих форм.
Виджеты дополнений
Подсистема дополнений
Дополнения с использованием compctl
Данный метод аналогичен по настройке тем дополнениям, что применяются в csh & tcsh и является немного устаревшим, так что новые пользователи скорее всего предпочтут использовать другие методы определения дополнений, но он все равно поддерживается текущими версиями zsh.
Задание дополнений с помощью данного метода имеет общую форму
compctl ключи [command ...]
Определение дополнения начинается с ключевого слова compctl и заканчивается списком команд для которых будет действовать дополнение.
Ключи определяют типы параметров которые будут подпадать под дополнение (ключи командной строки, списки выполняемых заданий, и т.п.).
Ключ -k указывает, что параметры, которые будут дополняться, будут переданы в массиве. Это ключ очень полезен, когда у вас списки параметров приведены в файле, или заданы в явной форме. Так, можно явно задать список серверов, имена которых будут дополняться при использовании команды ssh.
compctl -k "( server1 server2 )" ssh
в том случае, если у вас много серверов, то вы можете перечислить их в файле и вместо явного перечисления указать в скобках команду для получения содержимого нужного файла (в нашем примере пусть это будет ~/.servers):
compctl -k "( ` cat ~/.servers ` )" ssh
Ключ -K позволяет пользователю указать функцию, которая будет вызываться для получения списка дополняемых параметров.
Другие ключи команды compctl описаны в справочном руководстве по zsh.
Дополнительные источники информации
www.zsh.org , http://zsh.sunsite.dk/Doc/
Zsh User Manual - в процессе написания (http://zsh.sunsite.dk/Guide/)
Zsh FAQ -- http://www.zsh.org/FAQ/
Zsh refcard --