System Administration Toolkit: Использование всех преимуществ zsh

Оболочка Z (zsh) - это популярная альтернатива исходным оболочкам Bourne и Korn. Она предоставляет массу дополнительных функций, включая улучшения по автоматическому завершению различных команд, файлов и путей, привязку ключей к функциям и операциям.

Мартин Браун, внештатный автор, консультант

Мартин Браун (Martin Brown) пишет статьи уже более семи лет. Он является автором многочисленных книг и статей по различным темам. Его квалификация охватывает множество платформ и языков разработки - Perl, Python, Java™, JavaScript, Basic, Pascal, Modula-2, C, C++, Rebol, Gawk, Shellscript, Windows®, Solaris, Linux, BeOS, Mac OS X и т.д., а также Web-программирование, системное управление и интеграция. Мартин является внутренним экспертом (SME) компании Microsoft® и регулярно пишет для ServerWatch.com, LinuxToday.com и IBM developerWorks. Он также принимает участие в блогах Computerworld, The Apple Blog и на других сайтах. Связаться с ним можно через его Web-сайт.



18.04.2007

О данной серии

Обычный администратор UNIX® имеет ключевой диапазон утилит и приемов, применяемых для упрощения процесса администрирования. Для упрощения различных процессов используются ключевые утилиты, последовательности командной строки и сценарии. Некоторые из этих инструментов входят в операционную систему, но большинство приемов основаны на многолетнем опыте и желании администраторов облегчить себе жизнь. Данная серия посвящена способам максимального использования доступных инструментов в различных средах UNIX, включая методы упрощения администрирования в разнородной среде.


История появления zsh

Оболочки в UNIX и Linux® обычно разделяются на две категории в соответствии с исходными оболочками, включенными в ранние версии UNIX. Два типа соответствуют оболочкам Bourne и C; последняя из них более характерна, поскольку ее форма и структура подобна языку программирования C.

Оболочка Bourne проще в использовании и более понятная в сравнении с оболочкой C, но она является менее практичной для программирования сложных сценариев. Оболочка Korn обеспечивает простоту использования оболочки Bourne и добавляет расширения для управления заданиями (позволяя упростить управление несколькими фоновыми заданиями), возможность редактирования в командной строке и журнал, а также добавляет элементы оболочки С, позволяющие упростить программирование.

Оболочка Z (zsh) разработана с целью интерактивного использования, а не для программирования, поэтому она включает множество функций, упрощающих использование и выполнение команд. Примеры включают более обширное сопоставление имен файлов (подстановка), несколько потоков для перенаправления входов/выходов и полностью настраиваемую систему завершения командной строки.


Формирование имен файлов

Подстановка имен файлов представляет собой процесс, лежащий в основе преобразования имени файла или спецификации файлов в список файлов для использования в командной строке, например, при копировании или перемещении файлов. Базовая подстановка имен файлов включает использование символа ? вместо одного символа или * вместо одного или нескольких символов.

Например, для получения списка всех исходных файлов на языке C можно использовать листинг 1.

Листинг 1. Листинг всех исходных файлов C
$ ls *.c
barney.c        betty.c         fred.c          wilma.c

Можно использовать наборы букв (как в регулярных выражениях), например, для вывода списка файлов с расширением "c" или "o", как показано в листинге 2.

Листинг 2. Список файлов с расширениями "c" или "o"
$ ls *.[co]
barney.c        betty.c         fred.o
barney.o        fred.c          wilma.c

В оболочке zsh можно использовать те же символы-шаблоны, но для применения дополнительных параметров можно использовать расширенную подстановку. Для переключения на расширенную подставновку задайте переменную среды EXTENDEDGLOB или используйте: $ setopt extendedglob.

Теперь можно использовать такие конструкции, как символ ^ для отображения всех файлов, не соответствующих заданной спецификации файлов. Например, для вывода списка всех файлов, не соответствующих спецификации *.c, используйте код в листинге 3.

Листинг 3. Листинг файлов, не соответствующих *.c
zsh$ ls ^*.c            
barney.o        betty.h         fred.h          fred.o

Выражение <x-y> соответствует диапазону целых числ. Например, если журналы доступа регистрируются с использованием даты, то можно легко выбрать все файлы в определенном диапазоне дат. Для этого называйте файлы с использованием года, месяца и даты, в качестве заполнения используйте нули. Например, для вывода списка журналов от третьего до десятого ноября 2006 можно использовать код в листинге 4.

Листинг 4. Листинг журналов, созданных между третьим и десятым ноября 2006 года
zsh$ ls access<20061103-20061110>.log
access20061103.log      access20061106.log      access20061109.log
access20061104.log      access20061107.log      access20061110.log
access20061105.log      access20061108.log

Для сопоставления файлов также можно использовать группы-регулярные выражения. Например, используйте код в листинге 5 для вывода списка всех файлов с именем fred и barney.

Листинг 5. Перечень всех файлов с именами fred и barney
zsh$ ls (fred|barney)*
barney.c        fred.c          fred.o
barney.o        fred.h

Во вложенных папках также можно выполнять поиск с использованием **/; процесс является рекурсивным, например, команда find, поэтому можно создать команду, эквивалентную команде find, например, $ find . -name "*.c".

В оболочке zsh (с расширенной подстановкой) это можно расширить до: zsh$ ls **/*.c.

Или можно объединить примеры, например, найти всех файлы исходных и скомпилированных объектов C во вложенных папках с помощью команды, представленной в листинге 6.

Листинг 6. Поиск всех файлов исходных и скомпилированных объектов C
zsh$ ls **/*.(c|o)
glob/barney.c   glob/betty.c    glob/fred.o
glob/barney.o   glob/fred.c     glob/wilma.c

Наконец, оболочка zsh поддерживает различные постфиксные квалификаторы. Для получения списка исполняемых файлов используйте постфиксный квалификатор (*) в конце выражения подстановки (см. листинг 7).

Листинг 7. Получение списка исполняемых файлов
zsh$ ls *(*)
barney  fred

Можно также получить список исполняемых файлов с помощью (x) в конце выражения подстановки (см. листинг 8).

Листинг 8. Использование (x) для получения списка исполняемых файлов
zsh$ ls *(x) 
barney  fred

Перечисленные выше файлы являются исполняемыми владельцем файлов. Заглавная X служит для выбора файлов, исполняемых другими. Такое же правило применимо к режиму R/r (чтение) и W/w (запись) файла.


Подстановка команд или процессов

В большинстве оболочек можно использовать подстановку базовых процессов для внедрения выходных данных одной команды во входные данные или аргументы другой команды. Это можно сделать с помощью оператора "обратная галочка" (см. листинг 9).

Листинг 9. Использование обратной галочки для выполнения подстановки процесса
$ emacs `find . -name "*.html"`

В zsh имеется множество различных параметров. Основной способ заключается в использовании конструкции $(). Эта конструкция предоставляет непосредственную альтернативу символу обратной галочки, преимущество ее использования состоит в возможности простого встраивания и возможности вложения в определенные комбинации команд. Например, можно переписать код в листинге 9 на код в листинге 10.

Листинг 10. Альтернатива использованию символа обратной галочки для процесса подстановки
zsh$ emacs $(ls **/*.html)

Процесс подстановки начинается с перечисления компонентов папки и возвращает список имен файлов, который, в свою очередь, передается в список аргументов команды emacs.

Другая полезная конструкция - структура =(list). При использовании этой функции элемент в скобках создает временный файл и возвращает имя этого файла. Например, можно сформировать текстовый файл с помощью кода в листинге 11.

Листинг 11. Создание текстового файла
zsh$ cat =(print -l tom dick harry)                            
tom
dick
harry

Кроме того можно объединять эту конструкцию с другими элементами для поддержки более сложных выходных данных и фильтрации. Например, можно получить список процессов, соответствующих imapd и httpd (почтовая служба IMAP и http-служба Apache) с помощью следующей команды (см. листинг 12).

Листинг 12. Получение списка процессов, соответствующих imapd и httpd
zsh$ ps -ax |fgrep -f =(print -l httpd imapd)
 406 ?? Ss  0:02.05 /usr/sbin/httpd
 426 ?? S   0:01.32 /usr/sbin/httpd
 429 ?? S   0:06.42 imapd: sulaco.mcslp.pri [192.168.0.101] appleblog user.appleblog
 434 ?? S   0:57.81 imapd: sulaco.mcslp.pri [192.168.0.101] mcarc user.mcarc
 435 ?? S   0:00.14 imapd: sulaco.mcslp.pri [192.168.0.101] mlists user.mlists
 436 ?? S   0:00.12 imapd: sulaco.mcslp.pri [192.168.0.101] play user.play
 437 ?? S   0:01.16 imapd: sulaco.mcslp.pri [192.168.0.101] mc user.mc
 507 ?? S   0:01.25 /usr/sbin/httpd

В листинге 12 команда print выводит каждый аргумент в отдельную строку временного файла. Затем файл используется fgrep как списком соответствий относительно списка процессов. После выполнения команды временный файл удаляется.

Поскольку функция создает временные файлы из выходных данных, ее можно использовать для выполнения функций и последовательностей, ранее необходимых для создания временного файла и его удаления. Например, для сравнения списка файлов в двух папках можно вывести список файлов каждой папки во временный файл, а затем сравнить эти файлы с помощью команды diff. В zsh такой же результат можно получить с помощью одной командной строки (см. листинг 13).

Листинг 13. Сравнение списка файлов в двух различных папках
zsh$ diff =(ls new) =(ls old)
3d2
< barney.o
9d7
< fred.o

В этом примере две заменяемые команды ls создают временный текстовый файл, который затем сравнивается командой diff.


Несколько потоков входов/выходов

За счет процесса подстановки система предоставляет более широкие возможности перенаправления. В большинстве оболочек используется перенаправление в/из файлов (см. листинг 14).

Листинг 14. Перенаправление в/из файлов
$ crontab <newtab
$ ls > filelist

В zsh можно перенаправлять несколько выходов одновременно (см. листинг 15).

Листинг 15. Одновременное перенаправление в несколько выводов
zsh$ ls >listone >listtwo

Можно также выполнять ввод из нескольких потоков (см. листинг 16).

Листинг 16. Ввод из нескольких потоков
zsh$ sort <listone <listtwo

Неявным перенаправлением является канал, поэтому он используется практически таким же способом. Например, в любой оболочке можно использовать команду tee для перенаправления файла и стандартного вывода (см. листинг 17 ).

Листинг 17. Использование команды tee для перенаправления файла и стандартного вывода
$ ls | tee listone
barney
barney.c
barney.o
betty.c
betty.h
fred
fred.c
fred.h
fred.o
wilma.c

Можно использовать код в листинге 18 в оболочке zsh.

Листинг 18. Перенаправление в файл и стандартный вывод в zsh
zsh$ ls >fileone |cat
barney
barney.c
barney.o
betty.c
betty.h
fileone
fred
fred.c
fred.h
fred.o
wilma.c

Как дополнение к процессу подстановки с помощью конструкций <(list) и >(list) также можно выполнять перенаправление в/из других команд (см. листинг 19).

Листинг 19. Перенаправление в/из других команд с использованием < и >
zsh$ sort <(ls) <(ls /usr)      
X11R6
barney
barney.c
barney.o
betty.c
betty.h
bin
fileone
fred
fred.c
fred.h
fred.o
include
lib
libexec
local
sbin
share
standalone
wilma.c

В листинге 19 вывод из двух команд ls объединяется в виде стандартного ввода для команды sort, которая выводит объединенный и отсортированный список файлов из двух разных папок.

Обычно эта функция используется при вырезании и вставке для извлечения и воссоединения полей из одного файла в другой. Вероятно, будет использоваться несколько временных файлов в обычной оболочке (см. листинг 20).

Листинг 20. Использование временных файлов для извлечения и воссоединения полей из одного файла в другой
$ cut -f1 fileone >t1
$ cut -f5 filetone >t5
$ paste t1 t5

В zsh можно выполнить эту задачу без создания временных файлов, как это показано в листинге 21.

Листинг 21. Вырезание и вставка для извлечения и воссоединения полей из одного файла в другой в zsh
zsh$ paste -d: <(cut -d: -f1 /etc/passwd) <(cut -d: -f5 /etc/passwd)

Более того, поскольку перенаправленная подстановка может быть вложенной, можно создавать сложные структуры, например, объединить два поля из файла passwd в различном порядке из источника, удалить комментарии и выполнить сортировку (см. листинг 22).

Листинг 22. Создание сложных структур в zsh
zsh$ sort <(egrep -v '^#' <(paste -d: <(cut -d: -f5 /etc/passwd) <(cut -d: -f1 
/etc/passwd) ) )
:# mode.  At other times this information is handled by one or more of
Amavisd User:amavisd
Apple Events User:eppc
Application Owner:appowner
Application Server:appserver
...
Xgrid Agent:xgridagent
Xgrid Controller:xgridcontroller
sshd Privilege separation:sshd

Можно упростить код в листинге 22, приняв каждый элемент как он представлен в листинге 23.

Листинг 23. Упрощенный процесс
-	<(cut -d: -f1 /etc/passwd) - Get the first field
-	<(cut -d: -f5 /etc/passwd) - Get the fifth field
-	<(paste -d: <(f5) <(f1) ) - Recombine them in a different order
-	<(egrep -v '^#' <(paste...) - Remove the comments
-	sort <(egrep ...) - Sort the standard input

Завершение файла и команды

В некоторых оболочках, включая zsh, можно завершить файл или команду с помощью нажатия клавиши TAB. Воспользуемся в качестве примера текущей папкой (см. листинг 24).

Листинг 24. Листинг текущей папки
zsh$ ls
barney          betty.c         fred            fred.o
barney.c        betty.h         fred.c          wilma.c
barney.o        fileone         fred.h

При завершении можно ввести начало имени файла: zsh$ cd bar. Затем нажмите клавишу TAB и выполните полное или частичное завершение: zsh$ cd barney.

Нажмите TAB второй раз, будет представлен список доступных файлов (см. листинг 25).

Листинг 25. Получение списка доступных файлов
zsh$ cd barney
barney*   barney.c  barney.o

Такой же процесс завершения применим к папкам и путям. В оболочке zsh имеются и другие возможности завершения.


Настройка завершения

Ограничение завершения в своей стандартной форме заключается в возможности завершать только файлы и пути (включая команды), введенные из командной строки. Однако существует множество других областей, где требуется возможность завершить команду без полного ввода. Например, система управления Subversion исходным кодом предоставляет различные дополнительные команды, которые вводятся дополнительно к другим аргументам. Например, для фиксации изменений в хранилище Subversion используется команда фиксации: $ svn commit. Для обновления используется команда обновления: $ svn update.

Но эти команды требуется вводить вручную. Используя пользовательское управление завершением в zsh, можно добавить эти команды к svn как часть процесса завершения. Управление завершением является очень сложной (и иногда запутанной) системой, но ее основы довольно просты для понимания.

Завершение управляется различными командами, но основной командой является compctl. Эта команда содержит простой интерфейс для базового завершения. Завершение может применяться глобально (другими словами, к файлам и путям) или к определенным командам.

Имеется диапазон параметров и форматов, но для продолжения работы с концепцией Subversion можно использовать параметр -k для предоставления массива слов, действующего как потенциальное завершение команды svn (см. листинг 26).

Листинг 26. Использование параметра -k
zsh$ compctl -k '(commit checkout update status)' svn

Теперь, когда svn введено как начало команды, необходимо нажать TAB для завершения команды (см. листинг 27).

Листинг 27. Нажатие TAB для завершения команды
zsh$ svn com <TAB>
zsh$ svn commit

Система завершения включает стандартные функции и завершения, например, поиск зарегистированных пользователей в системе, домашних папок, узлов, сетей и т.д. Можно также добавлять и расширять эти функции, создавая пользовательские функции завершения.

Например, можно создать пользовательскую функцию с именем activeusers, возвращающую выходные данные из пользовательской команды: zsh$ function activeusers { reply =(`users`) }.

Теперь эти данные можно использовать в качестве завершения для другой команды, например, chat: zsh$ compctl -K activeusers chat.

Теперь после ввода в командной строке chat можно получить список завершения, который только возвращает список пользователей, зарегистрированных в данный момент в системе.

С системой завершения доступно множество параметров и функций, их описание не входит в задачу данной статьи. См. в разделе Ресурсы официальную документацию по доступным параметрам.


Заключение

Оболочка zsh содержит множество функций, предназначенных для облегчения взаимодействия между пользователем и средой оболочки. Расширения включают лучшие способы подстановки команд и перенаправления информации в/из различных процессов. Такие параметры позволяют преобразовывать множество команд, необходимых в других оболочках, в отдельную командную строку в zsh.

Фактическое различие между zsh и другими оболочками, даже с учетом последних улучшений в таких оболочках, как bash, заключается в способности настройки системы автоматического завершения, превышающей возможность работы только с именами файлов и путями. Расширение функциональности по поддержке дополнительных аргументов для существующих команд - это только один пример, система является гибкой и позволяет завершить практически любую команду или элемент командной строки.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=210486
ArticleTitle=System Administration Toolkit: Использование всех преимуществ zsh
publish-date=04182007