Библиотека сайта rus-linux.net
Сравнительный анализ оболочек
р Использование оболочек в интерактивном режиме
р Сценарии оболочки для личного применения
р Сценарии оболочки для общедоступного применения
Большинство современных версий UNIX поставляются с тремя оболочками - Bourne и/или POSIX, С и Кот - в качестве стандартных элементов. Но возможно применение и многих других оболочек, включая Z, ТС, RC и Bourne Again. Важно правильно подобрать оболочку, поскольку на ее изучение уходит много времени, а еще больше - на работу с ней. Правильный выбор позволит применять многие мощные функции UNIX с минимальными усилиями. Эта глава должна помочь читателю определиться с особенностями работы каждой оболочки.
Конечно, ни одна оболочка не может отвечать сразу всем требованиям. Если есть выбор, то следует знать, как подобрать оптимальную оболочку для конкретной работы.
Оболочка имеет три основные области применения:
1. Интерфейс операционной системы.
2. Механизм написания сценариев для личного использования.
3. Язык программирования для создания новых команд, предназначенных для других пользователей.
Каждая из них накладывает различные требования на выбираемую оболочку. Более того, каждая оболочка обеспечивает свой уровень поддержки для каждой области применения. Эта глава описывает преимущества и недостатки некоторых наиболее часто используемых оболочек в контексте выполняемых с их помощью задач.
Использование оболочек в интерактивном режиме
Прежде всего отметим, что выбор оболочки для использования в интерактивном режиме важен только для самого пользователя. Это дает значительное преимущество: можно не учитывать потребности и желания других. Имеют значения только личные предпочтения.
На выбор интерактивной оболочки оказывают влияние следующие принципиальные факторы:
- Прежний опыт. Может сыграть при выборе оболочки как положительную, так и отрицательную роль. Например, знакомство с оболочкой Bourne является преимуществом при работе с оболочкой Когn, но недостатком - при работе с С или ее разновидностью. Пусть прежний опыт не мешает вам изучать преимущества незнакомой оболочки. Для оболочек существует два главных стиля синтаксиса: Bourne и С. Главные члены семейства С - это С и ТС. Такие оболочки, как Z и Bourne Again, в разной степени поддерживают синтаксис С.
- Трудность изучения. К сожалению, с повышением мощи и гибкости инструмента он становится труднее в изучении. Молчаливым подтверждением этого часто служит перенасыщенный функциями видеомагнитофон, в котором хозяин не удосужился установить часы. Также и с оболочками UNIX. Сложность возрастает от оболочки Bourne к С, затем к Когn и остальным оболочкам, каждая из которых добавляет свои функции и дополнительные возможности к предьщущей. За овладение дополнительными функциями приходится платить временем, затраченным на их изучение и тренировку. Приходится оценивать, действительно ли эти дополнительные функции будут применяться достаточно часто, чтобы оправдать затраты времени на их изучение. Имейте в виду, что все оболочки в значительной мере подобны и относительно просты в изучении на самом базовом уровне. Семейство Bourne располагает более богатым (хотя и более сложным) языком программирования, чем семейство С. Хотя интерфейс программирования оболочки С легче в изучении, он может стать буквально препятствием при реализации большинства программных задач, кроме простейших сценариев.
- Редактирование команд. Все оболочки предоставляют функции, помогающие повторно выводить и использовать предыдущие команды. Оболочка Bourne составляет заметное исключение. Снижение дополнительных затрат времени с помощью функций редактирования команд в значительной мере зависит от интенсивности использования оболочки. Существуют целые поколения пользователей UNIX, которые жили и работали еще до того, как были изобретены оболочки С и Когn. Их опыт показывает, что популярная оболочка Bourne вполне приемлема, просто не столь удобна для опытного пользователя, имеющего хорошую практику работы с оболочкой, которая в той или иной форме обеспечивает повторное использование команд.
- Шаблоны и сокращения. И снова, продуктивность работы пользователя (как и ее удобство вообще) повышается при использовании оболочки, которая предоставляет быстрые способы выполнения рутинных операций. Знаки подстановки, псевдонимы команд и их завершение могут значительно сократить время ввода команд UNIX, если это приходится часто делать на протяжении дня.
- Переносимость. Если вы изо дня в день сидите перед одним и тем же терминалом, используете в UNIX одно и то же ПО и редко (а то и никогда) имеете дело с незнакомой системой, то, безусловно, выбирайте наилучшие из имеющихся в системе инструментов. Если вам приходится работать с различными версиями UNIX, что характерно для системных и сетевых администраторов, то имеет смысл составить набор инструментов (оболочек, редакторов и т.п.), которые могут применяться в большинстве или во всех системах. Не забывайте, что мало толку быть экспертом в мощной оболочке, если она есть не на всех машинах. Для профессионалов UNIX гораздо важнее знать язык оболочки, которая поддерживается всеми системами UNIX.
В таблице 13.1 представлена оценка семи распространенных оболочек в соответствии с рассмотренными критериями. Рейтинг 1 соответствует наилучшему выбору, 2 - приемлемой альтернативе, а 3 - неудачному выбору.
Таблица 13.1. Рейтинг оболочек для интерактивного использования.
Оболочка | Роль прежнего опыта | Редактирование | Функции сокращения | Переносимость | Сложность изучения |
Bourne | 3 | 3 | 3 | 1 | 1 |
POSIX | 2 | 1 | 2 | 1 | 2 |
С | 2 | 2 | 2 | 3 | 2 |
Коrn | 1 | 1 | 2 | 2 | 2 |
ТС | 2 | 1 | 1 | 3 | 3 |
Bourne Again | 2 | 1 | 1 | 2 | 3 |
Z | 2 | 1 | 1 | 3 | 3 |
Оболочка Bourne
Я считаю оболочку Bourne наилучшей для изучения, так как она простейшая из трех в применении, имеет наименьшее число отвлекающих функций и сбивающих с толку тонкостей синтаксиса. Если вы не очень интенсивно будете пользоваться командами оболочки UNIX, то, безусловно, имеет смысл освоить Bourne. Она позволит выполнять все необходимые операции, а преимущества в производительности других оболочек при использовании их от случая к случаю не имеют большого значения. Даже если вы рассчитываете часто пользоваться оболочкой UNIX, возможно, стоит ограничиться Bourne, если требуется достигнуть эффекта быстро.
Самые низкие оценки в категории производительности объясняются тем, что Bourne не имеет редактора команд и располагает минимальным набором функций сокращения. Если у вас достаточно времени и знаний для разработки собственных сценариев оболочки, вы можете компенсировать значительное число недостатков Bourne, как это делали многие опытные пользователи до того, как появились другие оболочки. Даже при этом отсутствие редактора команд и функции хронологии команд приводит к большим затратам времени на перепечатку и исправление команд. При интенсивном использовании клавиатуры оболочка Bourne является наихудшей. Если вы располагаете какой-либо другой оболочкой, то наверняка отдадите ей предпочтение.
Оболочки, подобные С и Коrn, были разработаны как раз вследствие низкой производительности Bourne. Новые оболочки были главным образом нацелены на создание среды управления с клавиатуры, более дружественной и легкой в использовании по сравнению с Bourne. Эти оболочки существуют по сегодняшний день именно потому, что большинство пользователей признали их лучшими.
Несмотря на низкий рейтинг производительности Bourne, в пользу этой оболочки говорят соображения переносимости. Будучи наистарейшей из трех оболочек (она написана для самых ранних версий UNIX), Bourne доступна практически везде. Если ваша работа предусматривает применение Bourne, ее можно выполнять за терминалом буквально любой машины. Этого нельзя сказать о таких оболочках, как С и Когп, которые доступны только для систем определенных производителей или современных версий UNIX.
Рейтинг прежнего опыта для Bourne - 3, поскольку опыт использования этой оболочки не дает повода для продолжения работы с ней. Можно немедленно перейти на любую ее разновидность, Когrn или Bourne Again, без дополнительного обучения и каких-либо неожиданностей. По мере освоения новых возможностей этих оболочек можно постепенно повышать свою эффективность работы с клавиатурой. Если вы знаете оболочку Bourne и доступна оболочка, являющаяся развитием Bourne, то нет причин отказываться от использования последней.
Оболочка Bourne предоставляется производителями UNIX, хотя и отошла на задний план с появлением оболочки POSIX. Например, в системах HP-UX 10.Х Bourne находится в каталоге /usr/old/bin, a POSIX - в каталоге /usr/bin, где традиционно находилась Bourne.
Оболочка POSIX
Оболочка POSIX (Portable Operating System Interface - переносимый интерфейс операционной системы) - результат повышения производительности интерактивных функций Bourne. POSIX очень схожа с оболочкой Коrn в отношении интерактивных функций. В большинстве случаев даже совпадают комбинации клавиш. Оболочка Коrn не стандартизирована, поэтому существуют досадные расхождения между версиями различных производителей ПО. В POSIX предпринята попытка создать единую оболочку для разных систем.
Современные оболочки POSIX соответствуют спецификации POSIX.2 IEEE POSIX Shell and Tools (IEEE Working Group 1003.2). Оболочка Bourne является подмножеством для оболочки POSIX.
Рейтинг 2 в категории трудности изучения для POSIX объясняется тем, что эта оболочка располагает значительно большим числом интерактивных функций в сравнении с Bourne, но меньшим, чем у Bourne Again или Z. Рейтинг удобства редактирования команд достигает 1, поскольку поддерживаются команды vi и emacs. POSIX предоставляет не столь богатый набор функций редактирования командной строки, как оболочки ТС, Bourne Again или Z, но для большинства задач и его более чем достаточно.
POSIX широко поддерживает сокращения, такие как псевдонимы, поиск с помощью команды cd, завершение имен файлов и контроль задач. Рейтинг функций сокращенного доступа достигает 2, так как в POSIX их намного больше, чем в Bourne, но меньше, чем в ТС, Bourne Again и Z. POSIX заслуживает наивысшей оценки с точки зрения переносимости, поскольку эта оболочка доступна для большинства наиболее распространенных версий UNIX.
Рейтинг по категории "Роль прежнего опыта" достигает двух, поскольку, если вы знаете POSIX и удовлетворены ее набором функций, то нет особых причин переходить на другую оболочку. Оболочки Bourne Again и Z поддерживают большинство функций POSIX предоставляют больше удобств. Если у вас есть потребность в некоторых дополнительных функциях, переход на другую оболочку не вызовет затруднений.
POSIX должна предоставляться производителями UNIX как часть стандартного набора оболочек.
Оболочка С
Рейтинг оболочки С по показателю трудности в изучении достигает 2. Эта оценка основана просто на общем объеме изучаемого материала. По числу и сложности функций С можно считать одной из самых неудобных оболочек. Не будет ошибкой сказать, что С может оказаться трудной в применении, а некоторые из ее функций довольно плохо документированы. Освоение оболочки требует времени, практики и экспериментирования. При сравнении с Bourne только на основе общих функций, оболочка С выглядит не более сложной, просто они не похожи друг на друга.
Рейтинг в категории редактирования команд для С невысок, поскольку этой функции в полном смысле слова не существует. Механизм подстановки из хронологической последовательности несколько сложен в изучении и порой неудобен, но это гораздо лучше, чем ничего. Одно лишь наличие функции хронологии команд и механизма подстановки дает преимущество над оболочкой Bourne. Но оболочка С сильно уступает простому и легкому в применении (если вы знаете vi или emacs) редактированию команд в Коrn, POSIX, Bourne Again, ТС или Z.
Например, оболочка Кот допускает повторное использование ранее введенных команд и даже их модификацию путем простого их вызова (Esc-k, если вы пользуетесь опцией vi) и перепечатывания части текста, которую требуется изменить. Оболочка С позволяет также использовать предыдущие команды, но для указания имени команды используется пять различных форм (!!, !11, !-5, !vi и !?vi), дополнительные формы для выбора аргументов команды (:0, :^, :3-5, :-4, :*, и это еще не все) и дополнительные модификаторы для изменения выбранного аргумента (:h, :s/old/new и т.д.). Даже запомнить синтаксис подстановки команд непросто, не говоря об его применении. Механизм подстановки из истории команд также не обеспечивает доступа к многострочным командам, таким как foreach. Отсутствие поддержки многострочных команд в истории может быть довольно неудобным, приходится перепечатывать все вложенные команды. Для разбирающегося в синтаксисе подстановка из хронологической последовательности, может оказаться быстрее редактирования, поскольку требуется меньше нажатий клавиш. Но это не заменяет хорошего редактора командной строки. Оболочки ТС, Bourne Again и Z поддерживают все функции подстановки С и обеспечивают редактирование командной строки.
С другой стороны, если вы любите использовать шаблоны, то найдете, что соответствующие расширения оболочки С для имен файлов легче в применении - они короче и имеют более простой синтаксис, чем в Коrn. Помимо шаблонов csh обеспечивает завершение частично набранных команд или имен файлов с помощью одного нажатия клавиш. Команда cd также несколько более гибкая. Команды pushd, popd и dirs некоторыми оболочками, например Коrn и POSIX, не поддерживаются прямо (хотя и могут быть реализованы с помощью псевдонимов и командных функций). Кроме того, оболочка С неплохо оценивается с точки зрения доступных клавиатурных сокращений. Возможно, это призвано компенсировать скромность функций редактирования команд. В зависимости от личных наклонностей оболочка С может показаться очень производительной. Замечено, что те, кто уже был знаком с С, не поддались недавнему повальному увлечению Коrn и другими новыми оболочками.
С точки зрения переносимости оболочка С занимает последние места, что просто объясняется уникальностью ее языка- Если вы знакомы только с этой оболочкой, а в данной системе она отсутствует, то вам не повезло. Пользователь оболочки С чувствует себя крайне неудобно, когда вынужден работать с Bourne, если он не владеет обоими языками и не знает их капризов и тонкостей.
По категории прежнего опыта рейтинг С достигает двух. Если вы уже знаете оболочку С, то хорошим кандидатом на замену ей может быть ТС. Оболочка ТС предоставляет редактор командной строки и другие удобные функции, она наверняка совместима с вашей текущей версией оболочки С. С другой стороны, продолжение работы с разновидностью С может ограничивать возможности, поскольку в семействе Bourne существует много других оболочек. Если вас не вполне устраивают функция подстановки из истории команд в оболочке С, а вы ее интенсивно применяете для исправления и повторного использования команд, то может оказаться, что возможности редактирования команд в другой оболочке оправдывают время и усилия, затраченные на их изучение. Каждый, кто привык пользоваться функциями редактирования команд, чувствует себя ущемленным, когда лишается такой возможности. Если вы еще не экспериментировали с Коrn, ТС, Bourne Again или Z, но такой шанс имеется, я настоятельно рекомендую потратить немного времени на ознакомление с одной из оболочек, чтобы сделать обоснованный выбор. Возможно, вы примете решение перейти на другую оболочку.
В любом случае оболочка С - проверенная интерактивная среда, обладающая многими преимуществами перед своим предшественником - Bourne. Здесь на выбор могут повлиять персональные наклонности. Но если вы новичок в UNIX, оболочка С-не самое лучшее начало.
Оболочка С должна предоставляться поставщиками UNIX как часть стандартного набора оболочек.
Оболочка Коrn
С точки зрения усилий и времени, затрачиваемых на овладение этой оболочкой, Коrn занимает среднее место. Причина не в плохой разработке или документировании, а просто в наличии более сложных функций, чем в оболочках Bourne и С. Конечно, чтобы приступить к работе с Коrn, не обязательно изучать все ее функции.
Интерфейс редактора команд Коrn позволяет быстро и легко исправлять опечатки, а также легко вызывать и повторно использовать команды из истории. Повторное использование многострочных команд по-прежнему несколько неудобно, поскольку все строки объединяются в одну, а переходы на новую строку обозначаются управляющими символами.
Коrn поддерживает использование шаблонов, эквивалентное аналогичным возможностям оболочки С, но их синтаксис сложен, его трудно запомнить. Можно использовать интерфейс команд pushd и popd, но только если вы или ваш знакомый создаст псевдонимы команд и функции для их реализации. Удобно использовать имя переменной в качестве аргумента команды cd. Использование псевдонимов команд и управление задачами в оболочках Коrn и С практически одинаково. Коrn не поддерживает автоматическое завершение при наборе команд, но обеспечивает завершение имен файлов. В отличие от большинства оболочек, здесь для завершения имени файла требуется два нажатия клавиш. С точки зрения эффективности использования клавиатуры оболочка Коrn превосходит С, в основном благодаря функции редактирования команд. В других отоношениях ее главное преимущество состоит в обеспечении многих расширений С в среде, совместимой с оболочкой Bourne. Если совместимость с оболочкой Bourne не имеет для вас значения, то и сама Коrn может не представлять особого интереса.
Коrn занимает второе место после оболочек Bourne и POSIX в категории переносимости. Если вы знаете язык оболочки Коrn, то знаете и оболочку Bourne, поскольку синтаксис ksh является расширением синтаксиса sh. Если вы знакомы с Коrn, то можете достаточно эффективно работать с любой системой, в которой есть либо Коrn, либо Воurnе, а доля таких систем среди существующих сред UNIX близка к 100%.
Наконец, по категории влияния прежнего опыта рейтинг Когп достигает двух. Если вы знаете оболочку Bourne, то, вероятно, захотите расширить свои знания, изучив расширения Коrn и сделав Коrn регистрационной оболочкой. Если вы уже знакомы с ksh, то, вероятно, на этом и остановитесь, если вас не соблазнят некоторые дополнительные возможности bash или zsh. Если вы знакомы с csh, то преимущества ksh могут оказаться недостаточными для перехода на другую оболочку.
Если вы впервые работаете в UNIX, то неплохо начать с Коrn. Сложности функции редактирования команд, скорее всего, не очень замедлят вашу работу. Вы будете использовать синтаксис редактирования команд так интенсивно, что он быстро станет привычным.
Оболочка Коrn должна предоставляться поставщиком UNIX в качестве части стандартного набора.
Оболочка ТС
Она может рассматриваться как очередное поколение С. ТС поддерживает в полном объеме синтаксис С и дополнительно обеспечивает мощные функции редактирования командной строки, включая проверку синтаксиса имен файлов и идентификаторов пользователя, дополнительные функции завершения (имен хоста, имен переменных, псевдонимов и т.д.) и подстановки (имена переменных, имена файлов). Есть много и других функций, просто невозможно все перечислить.
Рейтинг ТС по категории трудности изучения достигает трех из-за обилия функций, а также сложности применения/конфигурирования некоторых из них. Например, оболочка ТС предоставляет механизм программируемых подстановок, что удобно в применении, но сложно в программировании. К счастью, ТС содержит несколько готовых подстановок.
ТС предоставляет редактор командной строки emacs или vi. В отличие от оболочек Коrn и POSIX здесь возможен emacs-стиль поиска с приращением. Эти функции обеспечивают ТС рейтинг 1 по категории редактирования. Однако в работе с многострочными командами остаются возможности для совершенствования. Такр команда foreach по-прежнему не располагает средством циклического просмотра истории в редакторе истории команд, в отличие от редакторов команд в POSIX, Korn, Bash и Z.
Оболочка ТС располагает изобилием функций сокращенного доступа, здесь ее рейтинг достигает единицы. По этому параметру ее превосходит только оболочка Z. ТС имеет низкий рейтинг в категории переносимости, поскольку она доступна не во всех системах и обычно не предоставляется поставщиками ОС. Поскольку существует только один источник ТС, эта оболочка одинакова для всех систем, если не считать расхождений различных выпусков.
Что касается прежнего опыта, если вы знакомы с С, то перейти на ТС будет несложно. Фактически, в чтении файла .cshrc не будет изменений. Можно по мере необходимости постигать более совершенные функции. Итак, для пользователя С вполне оправдан переход на ТС. ТС не достигает рейтинга 1 по категории прежнего опыта, поскольку эта оболочка несовместима с Bourne. Именно поэтому изучение ТС для пользователей большинства других оболочек вызывает затруднения.
ТС обычно не предоставляется в качестве стандартной, тем не менее она установлена во многих системах. Если в вашу систему не установлена tcsh, обратитесь к http://www.primate.wisc.edu/software/csh-tcsh-book для информации об источнике и готовых скомпилированных бинарных файлах. Указанный Web-узел предоставляет массу информации о ТС, включая man-страницы, книги и ПО поддержки. Если этот адрес не удовлетворит вас, испробуйте свой излюбленный WWW-механизм поиска для ключевого слова tcsh.
Оболочка Bourne Again
Эта оболочка разработана в рамках проекта GNU и совместима с POSIX. Оболочку Bourne Again (bash) можно считать следующим поколением Korn, поскольку она - включает в себя все функции версии Korn 1988 года и содержит многие функции Korn 1993 года. Bourne Again предоставляет также эффективную поддержку многих функций С, включая подстановку из хронологической последовательности с применением оператора !, переадресовки вывода >&, символов подстановки {} и команды source. Это обеспечивает достаточный комфорт для приверженцев оболочки С.
Оболочка Bourne Again предоставляет большие возможности. Фактическая длина man-страницы составляет 55 страниц. Большее число функций требует больших усилий для овладения bash, поэтому она заслуживает оценки 3 по категории трудности в изучении. Не следует понимать это так, что оболочка Bourne Again чрезмерно трудна. Можно иметь неплохую продуктивность, и не изучая всех ее функций.
Возможности редактирования командной строки для многострочных команд здесь лучше, чем у POSIX, Korn и ТС. Каждая строка отображается в истории отдельной записью. При этом становится немного легче повторно использовать фрагменты команд, но затруднено повторное применение команд целиком. Однако bash располагает переменной среды command_oriented_history, которая при получении значения помещает команды в хронологический ряд, разделяя их точкой с запятой (;).
Bourne Again имеет хорошие показатели в отношении функций сокращенного доступа и заслуживает рейтинга 1. Она предоставляет стек каталогов с большим числом функций, чем у оболочки С, включая и возможность отображать отдельные элементы стека каталогов. Функций завершения и подстановок командной строки также больше, чем в оболочках С, POSIX и Korn.
Что касается переносимости, bash представляет собой загадку. Я определил для нее рейтинг 1, истолковав сомнения в пользу оболочки, поскольку она позволяет эмулировать POSIX. В этом режиме все операции могут быть легко воспроизведены для оболочки POSIX. С другой стороны, bash не универсальна и нужно быть внимательным с функциями, для которых важна переносимость.
Рейтинг в категории роли прежнего опыта также составляет 1. Если вы пользуетесь оболочкой из семейства Bourne, то переход на bash будет нетрудным и наверняка предоставит новые возможности. Если вы привыкли к оболочкам, производным от С, то переход на Bourne Again будет относительно безболезненным, поскольку ее синтаксис в достаточной мере повторяет синтаксис С. При этом радует то, что Bourne Again располагает удобным сценарием для перевода псевдонимов оболочки С в синтаксис Bourne Again и для семантических подстановок (например $PWD вместо $cwd). В часто задаваемых вопросах по оболочке Bash - bash FAQ (Frequently Asked Questions) - даже содержатся подсказки по эмуляции общих функций С, таких как :г-замены.
Большинством производителей UNIX оболочка Bourne Again обычно не поставляется в качестве стандартной, тем не менее она установлена во многие системы. Фактически, эта оболочка считается стандартной для систем Linux. Прилагаемый к книге компакт-диск содержит версию bash. Для получения дополнительной информации о том, где можно найти архивы исходных кодов и бинарных Bash-файлов, обратитесь к FAQ по адресу URL ftp://slc2.ins.cwru.edu/pub/bush/FAQ. Если это не принесет успеха, воспользуйтесь любимым поисковым сервером Web, используя ключевые слова Войте Again или bash FAQ.
Оболочка Z
Эта оболочка больше всего подходит для пользователей, обожающих изобилие функций. Она выполняет почти все, что только можно пожелать от оболочки. За эту мощь приходится платить. Например, в системе HP-UX 10.01 для zsh исполняемый файл примерно в четыре раза превосходит по размеру исполняемый файл ksh (оболочки Коrn) и почти в три раза - для sh (оболочки Bourne).
Не думаю, что кто-либо знает все функции оболочки Z, включая и ее автора - Пола Фалстада (Paul Falstad). Изучение даже половины функций будет стоить труда, поэтому здесь оболочке присвоен рейтинг 3. Но это не значит, что оболочка Z плохо разработана или документирована. Все дело просто в большом количестве функций.
Что касается редактирования командной строки, Z на голову выше любой из рассматриваемых в этой главе оболочек. Z наилучшим образом, по моему мнению, поддерживает многострочные команды. Каждая команда представляет собой редактируемый буфер, что облегчает редактирование и повторное использование команд целиком, при этом сохраняется исходный вид команды. Оболочка Z располагает наибольшим числом функций завершения и подстановок. Доступ к функциям подстановок в высшей степени легок и логичен. Например, при первом нажатии на клавишу Tab в процессе печати имени переменной происходит его завершение, второе нажатие разворачивает значение переменной в командную строку (если при завершении не возникло амбивалентности). Оболочки bash и tcsh для подстановки значений переменных требуют отдельного редактора команд (в режиме emacs для bash значение переменной подставляется посредством команды Esc-$). Z поддерживает программируемое завершение, которое еще более облегчает редактирование командной строки. Например, можно запрограммировать команду cd так, чтобы завершения или подстановки применялись только к каталогам. Оболочка Z обладает возможностями исправления опечаток в написании имен путей и имен пользователей. Все эти функции позволяют присвоить оболочке рейтинг 1 в категории редактирования.
Z занимает первое место по функциям сокращенного доступа. Представим, что два разработчика работают над набором файлов для проекта, а вам требуется определить, какие файлы требуют слияния. Для этого нужно выявить одинаковые файлы в рабочих каталогах разработчиков. Затем предположим, что требуется поместить этот список общих файлов в файл для редактирования с помощью текстового редактора vi. Отредактированный список содержит файлы-кандидаты на слияние. Допустим, вы пользуетесь оболочкой С (для примера нужно привести наихудший случай сценария). Можно воспользоваться циклом foreach с опцией if (-e filename) для проверки существования файлов и вывода их имен, но оболочка С не допускает переадресовки из конструкций циклов. Создание временного сценария - непростое дело, поэтому лучше всего воспользоваться командой UNIX comm (она выбирает или отбрасывает строки, общие для двух отсортированных файлов). Ниже приведен пример сеанса оболочки С, где символы # обозначают комментарии.
% (cd ~harryman/cxxsource/projl;ls *.{сс,hh}) > /tmp/davesFiles
# требуется присвоить имя временному файлу
% (cd ~robic/dominic/proj1 *.{cc,hh}) > /tmp/mattsFiles
# требуется присвоить имя еще одному временному файлу
% comm -12 /tmp/daveaFiles /tmp/matsFiies > naedMerge
#отобразить содержимое Обоих файлов
% rm /tmp/daveaFiles /tmp/mattsFiles
#Стереть эти проклятые временные файлы
% vi needMerge
#наконец vi!
Войдите в оболочку Z и воспользуйтесь синтаксисом подстановки =(). Как видно из следующего сеанса Z, где выполняется та же задача, процесс подстановки избавляет от мороки с временными файлами.
% vi =(comm -12 =(cd -harryman/cxxsource/proj1;ls *.{cc,hh}) =(cd -robic/dominic/projl;
la {*.fcc,hh}))
Функция подстановки автоматически создает временный файл, помещает в него вывод, а затем передает имя временного файла команде, которая должна его обрабатывать. К другим удобным функциям сокращения Z относятся:
- Рекурсивный поиск каталогов (ls **/file).
- Простое разветвление посредством множественных переадрессовок (ls >filel >file2).
- Опция autocd, допускающая смену каталога без помощи команды cd, так что команды cd dirname и dirname становятся эквивалентными.
- Стенографическая запись команд. < file эквивалентна more <file, > file эквивалентна cat >file,>> file эквивалентна cat >>file.
- Редактирование переменных среды с помощью встроенной команды vared.
- Остальные функции слишком многочисленны, чтобы приводить их здесь.
Единственным уязвимым местом оболочки Z остается переносимость. Она не встречается в таком количестве систем, как большинство других оболочек. Чтобы облегчить положение, Z может эмулировать Коrn, С или POSIX. По категории переносимости ей присвоен рейтинг 3.
Z находится на хорошем счету по значению роли прежнего опыта. Независимо от привычной пользователю оболочки переход на Z не создает больших затруднений. Стойким приверженцам С могут помочь различные опции CSH_JUNKIE, пока пользователи полностью не адаптируются к новой оболочке. Z поддерживает большинство функций оболочки С для любой не-С оболочки, включая: ^^-быструю подстановку, команды foreach и pushd/popd. Пользователи Bourne, Korn и POSIX найдут для себя привычные переключатели эмуляции оболочек. Если не принимать в расчет переносимость, трудно не соблазниться возможностями оболочки Z. Как и следует из названия, Z - последняя оболочка, которая вам когда-либо понадобится.
Производители UNIX не предоставляют Z в качестве стандартной оболочки; zsh не так распространена, как некоторые другие оболочки. Если в вашей системе не установлена zsh, поищите на Web-узлах http:/ /www.mal.com/zsh/FAQ/toc.html или http://www.mal.com/zsh/zsh_home.shtml информацию об исходных и бинарных файлах. Приведенные URL предоставляют и другую информацию об оболочке Z, включая man-страницы. Если с URL-адресами вас постигнет неудача, обратитесь к серверам поиска WWW с ключевым словом zsh.
Сравнение интерактивных функций оболочек
Для сравнения в таблице 13.2 описаны некоторые интерактивные функции, которые доступны не для всех оболочек. Общие для всех оболочек функции здесь не перечислены (например, применение звездочки (*) в качестве символа шаблона, использование переменной пути для поиска исполняемых файлов, возможность использовать и определять переменные среды и т.п.). Многие из этих функций могут использоваться в сценариях, но поскольку они применяются главным образом в интерактивных сеансах, то включены в таблицу.
В некоторых функциях упоминается подстановка (expansion) или завершение (completion). В таблице 13.2 подстановка относится к подстановке значения, представленного лексемой командной строки. Например, лексема командной строки *.star может быть развернута в dark.star dwart.star ura.star (все три файла соответствуют выражению с символом шаблона *.star). Если переменную $LOGNAME развернуть в командной строке, она будет заменена лексемой sdrew. Завершение подразумевает функцию дописывания оболочкой частично введенного пользователем имени. Например, если напечатать в командной строке $DIS и воспользоваться функцией завершения, то оболочка допишет PLAY, завершая имя переменной, и в результате в командной строке будет значиться $DISPLAY.
Таблица 13.2. Непереносимые функции оболочек: интерактивный режим.
Функция | sh | csh | ksh | tcsh | bash | zsh |
Псевдонимы | POSIX | X | X | X | X | X |
Завершение псевдонимов | - | - | - | X | X | X |
Псевдонимы принимают аргументы | - | X | - | X | - | - |
Автоматический вывод вариантов для амбивалентных завершений | - | - | - | X | X | X |
Поиск пути | POSIX | Х | Х | Х | Х | Х |
Псевдонимы команд | POSIX | Х | Х | Х | Х | Х |
Редактирование команд (emacs) | POSIX | - | X | X | X | X |
Редактирование команд (vi) | POSIX | - | X | X | X | X |
Завершение команд | - | X | - | X | X | X |
Завершение встроенных команд | - | - | - | X | X | X |
Просмотр документации к команде во время набора команды | - | - | - | X | - | - |
История команд | POSIX | Х | Х | Х | Х | Х |
Дополнение истории команд | POSIX | - | X | - | X | - |
Поддержка вспомогательного процесса | POSIX | - | X | - | - | X |
Подстановка из списка истории | - | X | - | X | X | X |
Развертка истории | - | - | - | X | X | X |
Завершение имени файла | POSIX | X | X | X | X | X |
Подстановка имени файла | POSIX | - | X | X | - | X |
Завершение функции | - | - | - | - | X | X |
Завершение имени хоста | - | - | - | - | X | X |
Поиск в истории с приращением | - | - | - | X | X | X |
Управление задачами (bg, fg...) | POSIX | X | X | X | X | X |
Наблюдение за входом/выходом из системы | - | - | - | X | - | X |
Команды с несколькими приглашениями в буфере истории | POSIX | - | X | - | X | X |
Встроенная команда notify | POSIX | X | - | X | X | - |
Завершение одного нажатия на клавишу | - | X | - | X | X | X |
Программируемое завершение | - | - | - | X | - | X |
Команды pushd, popd и/или другие команды управления стеком каталогов | - | X | - | X | X | X |
Рекурсивное сканирование командной строки | POSIX | X | - | X | X | - |
Коррекция синтаксиса имен пользователей, команд и имен файлов | - | - | - | X | - | X |
Селекторы подстрок :х | - | X | - | X | X | X |
Завершение переменных | - | - | - | X | X | X |
Подстановка переменных | - | - | - | X | X | X |
Редактирование переменных | - | - | - | - | - | X |
Шаблоны *(...) | POSIX | - | X | - | - | X |
Выражения команд $(...) | POSIX | - | X | - | X | X |
Шаблоны {...} | - | X | - | X | X | X |
Примечание: Столбец sh относится к оболочкам POSIX и Bourne. Если функция встречается только в одной оболочке, то вместо символа Х ставится название этой оболочки. Короче говоря, и- " означает отсутствие оболочки, Х - обе оболочки, Bourne - только оболочка Bourne, а POSIX - только оболочка POSIX.
Сценарии оболочки для личного применения
Если вы разрабатываете какие-либо сценарии оболочки для личного использования, то, вероятно, захотите написать их на том же языке оболочки, который используете для интерактивных команд. Как и для интерактивного режима работы, выбор языка для личных сценариев в значительной мере индивидуален.
Пользуетесь ли вы разновидностью оболочки С или оболочки Bourne, стоит подумать о применении языка Bourne для написания сценариев. На это есть две причины. Во-первых, личные сценарии не всегда остаются таковыми. Они могут со временем развиваться и постепенно передаваться от одного пользователя к другому, пока удачные экземпляры фактически не станут стандартами для установки. Как вы узнаете из раздела "Сценарии оболочки для общедоступного применения", написание сценариев на отличном от Bourne языке несколько рискованно, поскольку это ограничивает число систем и пользователей, которые смогут их применять.
Во-вторых, хотя разновидности С переполнены превосходными интерактивными функциями, им явно недостает возможностей программирования. Главный недостаток версий С состоит в отсутствии функций оболочки (возможно, настало время для оболочки C++). Это в значительной мере затрудняет структурное программирование. Каждая функция должна быть либо отдельным файлом, либо псевдонимом. Для более сложных задач написание псевдонимов может быть трудным, а то и невозможным. Разновидности С также не поддерживают подстановку параметров и значительно уступают по числу переменных и проверок файлов другим оболочкам. Лучше просто отказаться от программирования в оболочке С. Конечно, для простейших сценариев, содержащих несколько команд, которые используются главным образом в качестве расширенных сокращений команд, проблема переносимости не принципиальна.
Написание коротких простых сценариев для автоматизации общих задач - это хорошая привычка и стиль работы в UNIX. Для использования возможностей оболочек UNIX в полной мере очень важно приобрести навыки написания сценариев. Самый естественный путь для достижения этого - написание собственных сценариев на том же языке, который используется для ввода команд с клавиатуры.
Ради сравнения в таблицу 13.3 включены функции программирования, доступные не во всех оболочках. Хотя перечисляемые здесь функции используются большей частью в сценариях, ничто не мешает применять их в интерактивных сеансах.
Таблица 13.3. Непереносимые функции оболочек: программирование.
Функция | sh | csh | ksh | tcsh | bash | zsh |
Арифметические выражения | POSIX | X | X | X | X | X |
Переменные массивов | POSIX | X | X | X | X | X |
Присвоение id=string | X | - | X | - | X | X |
Оператор caseb | X | - | X | - | X | X |
Опция clobber | POSIX | X | X | X | X | X |
Опция echo-n | - | X | - | X | X | X |
Оператор for | X | - | X | - | X | X |
Команда export | X | - | X | - | X | X |
Оператор foreach | - | X | - | X | - | X |
Встроенная команда getopts | POSIX | - | X | - | X | X |
Команда glob | - | X | - | X | - | - |
Задачи хэш-таблицы, команды rehash и unhash | - | X | - | X | - | - |
Команда let | POSIX | - | X | - | X | X |
Команды limit и unlimit | - | X | - | X | - | X |
Встроенная команда nice | - | X | - | X | - | - |
Встроенная команда nohup | - | X | - | X | - | - |
Команда onintr | - | X | - | X | - | - |
Команда print | POSIX | - | X | - | X | X |
Переадресация из итерационных операторов | X | - | X | - | X | X |
Переменная среды RANDOM | POSIX | - | X | - | X | X |
Встроенная команда repeat | - | X | - | X | - | X |
Оператор select | POSIX | - | X | - | X | X |
Команды setenv, unseten | - | X | - | X | - | - |
Переменная SHELL указывает команду для выполнения сценариев | - | X | - | X | - | - |
Оператор switch | - | X | - | X | - | - |
Оператор until | X | - | X | - | X | X |
set-x | X | - | X | - | X | X |
set optionname | - | X | - | X | X | X |
Функции оболочки | X | - | X | - | X | X |
Команда trap | X | - | X | - | X | X |
Команда typeset | POSIX | - | X | - | X | X |
Команда ulimit | X | - | X | - | X | X |
Неопределенная переменная является ошибкой | - | X | - | X | - | - |
Специальный символ ! | - | X | - | X | X | X |
Команда @ | - | X | - | X | - | - |
Перенаправление >& | - | X | - | X | X | X |
Сценарии оболочки для общедоступного применения
Разработанные для общего применения сценарии должны быть переносимыми. Такие сценарии почти всегда пишут на языке оболочки Bourne. Хотя в последнее время намечается тенденция использования для этих целей языка оболочки Кот, это достаточно рискованно.
Некоторые версии UNIX позволяют указывать, какой интерпретатор оболочки использовать для данного файла сценария. Это осуществляется путем ввода специальной команды в первой строке сценария. Так, команда #! /bin/sh в первой строке сценария для большинства современных систем UNIX задает использование оболочки Bourne для выполнения файла сценария. Эта функция позволяет пользователям разрабатывать сценарии на удобном для себя языке, что не мешает применять сценарий независимо от оболочки, используемой в интерактивных сеансах. Но функция #! доступна не во всех версиях UNIX.
Сценарии, написанные на языках, отличных от Bourne или POSIX, требуют, чтобы операционная система включала соответствующую оболочку. Например, оболочки С и Коrn требуют, чтобы в систему была установлена csh или ksh. He все системы отвечают этому требованию, и если важна переносимость между несколькими платформами или между текущей и будущей платформами (то есть вы пишете сценарий для повсеместного применения сейчас и в будущем), здравый смысл требует избегать конструкций не-Bourne синтаксиса. Если вы пишете сценарии в оболочке POSIX и избегаете любых новых встроенных команд, таких как select, то сценарии будут обладать хорошей переносимостью. Основная несовместимость оболочек Bourne и POSIX (если используется только синтаксис Bourne) обусловлена старой функцией Bourne. Если функция вызывается из сценария в оболочке Bourne, аргументы командной строки искажаются. С оболочкой POSIX дело обстоит иначе. Всегда сохраняйте требуемые аргументы командной строки ($1, $2...). Сохранение переменных командной строки в других переменных облегчает чтение сценария и улучшает его переносимость.
Требования истинной переносимости ограничивают использование команд UNIX и опций команд внутри сценария оболочки. Некоторые версии UNIX, особенно реализованные IBM, предоставляют много новых опций для множества команд, что стимулирует разработку сценариев, которые могут работать только в среде IBM-реализации UNIX. Другие версии UNIX, такие как ULTRIX и XENIX, поддерживают только устаревшую библиотеку команд, а также некоторые другие локальные функции. Если вы действительно заинтересованы в разработке переносимых программ и сценариев оболочки, нужно следовать рекомендациям по совместимости POSIX и Х/Ореп, которые описывают только команды и опции, широко доступные в большинстве реализации операционной системы UNIX.
На переносимость влияет даже диалект оболочки Bourne. Например, в системе ULTRIX команда sh обеспечивает функциональность только седьмой версии UNIX. Для запуска System V - совместимой с Bourne оболочки - следует вводить команду sh5. С появлением POSIX и стремлением производителей обеспечить совместимость с POSIX эта проблема теряет остроту. Стандарт POSIX.2 требует, чтобы отвечающая ему система по команде sh запускала оболочку POSIX.
Поскольку идеальная переносимость просто недостижима в 20 веке, здравый смысл диктует, чтобы затрачиваемые на создание переносимых программ усилия соответствовали решаемой задаче. Вы можете руководствоваться следующими положениями:
- Для очень важных проектов выбирайте любой желаемый язык оболочки (или другой инструмент) - ваш выбор просто повлияет на требования для установки и применения системы. (Не забывайте доводить эти требования до пользователей.)
- Если сценарий должен быть широко доступным, ограничьтесь языком оболочки Bourne и выберите среду System V Release 1. Это предоставит в ваше распоряжение множество инструментов и сделает приложение совместимым с подавляющим большинством современных систем UNIX.
- Если сценарий предназначен для локальной установки, остановитесь на языке Bourne, POSIX или Коrn. Пользуйтесь оболочкой Коrn только тогда, когда есть необходимость в ее функциях. Шансов на то, что будущие выпуски операционной системы или изменения производителя будут продолжать поддерживать ваш сценарий, очень мало.
- Если проект должен отвечать определенным требованиям совместимости (например, работать на машинах HP-UX и SunOS, установленных в трех офисах и двух разных государствах), то, безусловно, нужно настроить проект соответствующим образом. В проекте могут остаться аспекты, для которых требования совместимости не заданы. В таких случаях нужно выбирать максимально возможный уровень обобщенности и переносимости.
- Во всех остальных случаях выбирайте инструменты и языки, которые, по вашему мнению, обеспечат максимальную эффективность, отсутствие затруднений и дружественность разрабатываемого приложения. Не забывайте и о продуктивности своей работы над проектом.
Резюме
Выбор оболочки в качестве интерактивного интерпретатора командной строки - относительно нехитрая задача, если ваш выбор не отражается на других пользователях. Если вы новичок в UNIX, то стоит подумать о POSIX, поскольку ее встроенные функции редактирования команд могут значительно повысить производительность. Для тех, кто привык к С, изучение POSIX рекомендуется по тем же причинам.
Знакомство с оболочками Bourne и POSIX, их возможностями и ограничениями важно для тех, кому приходится работать с разнообразием систем UNIX или с пользователями UNIX вообще. Bourne - это единственная повсеместно доступная оболочка для всех операционных систем UNIX, a POSIX становится почти в такой же мере распространенной.
Для повседневной работы хороша любая оболочка, кроме Boume. Если есть другие оболочки, пользоваться Bourne не стоит. Ей явно недостает интерактивных функций, а отсутствие редактирования команд и механизма истории не способствуют продуктивности работы.
Выбор оболочки для написания сценариев - проблема более сложная.
Более новые оболочки предоставляют средства создания сценариев, без которых трудно обойтись. К ним относятся упрощенный синтаксис подстановки команд, поддержка массивов, арифметические функции и выражения, более совершенно структурированные команды, такие как select. Эти удобные инструменты стоит использовать для любых разработок, предназначенных для личного употребления. Они также предпочтительны для локальных проектов, когда заранее достаточно точно известна среда, в которой им предстоит работать. Но если сценарии предназначены для более широкой аудитории, оболочка Bourne по-прежнему является универсальным языком мира UNIX.
Если автору сценариев не известна заранее аппаратная и программная среда, ему стоит подумать о подборе таких команд и опций, которые используются в сценарии и языке оболочки. Некоторые оболочки предоставляют более широкое по сравнению с остальными разнообразие команд и опций. В некоторых версиях UNIX опущены отдельные удобные интерактивные функции. Для большинства задач минимальной основой переносимости следует считать соответствие стандартам UNIX System V Release 1. В случаях, когда переносимость особенно важна, в качестве руководства по доступным функциям операционной системы лучше использовать не инструкции производителя, а стандарты POSIX и Х/Ореп.
Программирование с помощью оболочек может быть настолько простым или сложным, насколько вам хочется. Оболочки - достаточно сложные инструменты программирования, они позволяют создавать ПО, пригодное для профессиональной работы. Фактически, сценарии оболочки могут использоваться вместо традиционного языка третьего поколения, такого как С или C++. Однажды я заменил программу на языке С длиной в 500 строк сценарием в 4 строки. Использование сценариев оболочки становится популярным в качестве метода макетирования и быстрой разработки программ.
Для интерактивных сеансов можно остановится одной удобной оболочке, а среда для написания сценариев должна пересматриваться для каждого отдельного проекта.