Журнал LinuxFormat - перейти на главную

LXF93:Сравнение

Материал из Linuxformat
Версия от 16:37, 20 ноября 2008; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Содержание

Командные оболочки

Не забирались дальше Bash? Оболочка – не просто поле для ввода команд, так что познакомьтесь с парочкой экземпляров из коллекции Нейла Ботвика.

Разве мы не обсуждали терминалы совсем недавно? И есть ли разница между оболочкой и терминалом? Ответы – да, в обоих случаях. Оболочка – это программа, работающая в терминале. Она отображает приглашение для ввода команд и пытается выполнить то, что вы ей вводите. Возможно, разница не столь очевидна в Х-терминале, где вы регистрируетесь автоматически, но в виртуальной консоли (в том экране, который вы видите, когда Х не запущен), выводящей текстовое приглашение для входа в систему, оболочка не запускается до тех пор, пока вы не введете правильные имя пользователя и пароль.

Каждый пользователь может работать в своей оболочке, так что себе вы можете поставить «мощную» оболочку, а для своей бабули предусмотреть более понятную. Даже если вы сроду не вводили команды в окно терминала, оболочкой вы все же пользовались: многие программы на вашем компьютере фактически являются ее сценариями, так что запуская программу, вы каждый раз запускаете оболочку, даже если делаете это, нажимая на значок.

Оболочки всех размеров

Рассмотренные здесь оболочки делятся на три основных категории. Оболочки общего назначения, типа Bash и Zsh, предлагают широкий выбор функций и свойств. Оболочки-легковесы, например, Dash, предлагают самые основные функции в небольшом пакете, и хороши для старых ПК или систем с ограниченными ресурсами; это также хорошие кандидаты на интерпретацию скриптов, которым не нужны «навороты» Bash со товарищи. Третья категория, оболочки особого назначения, созданы для специальных приложений или сред.

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

Кроме внешних команд, каждая оболочка умеет выполнять некоторое количество собственных команд (‘builtins’), ускоряющих выполнение основных операций. Большинство рассматриваемых оболочек соответствуют основному стандарту POSIX. Различаются они предлагаемыми дополнительными функциями. Это могут быть дополнительные builtin-команды, функции типа расширенного дополнения или попросту минимальная среда POSIX в компактной и быстрой программе.

Про наш тест...

Оболочки  используются  двумя  способами.  При  интерактивном  применении  самым  важным  аспектом  является  простота:  предоставляется  ли  стандартное  или  расширенное  дополнение,  хороша  ли  документация,  есть  ли  подсказка?  Другой  способ  использования  –  в  качестве  движка  для  запуска  сценариев  оболочки.  Здесь  основными требованиями будут, во-первых, совместимость со стандартами, а во-вторых – и  это менее важное требование – скорость. 

Для оболочек не существует стандартных  тестов,  да  если  бы  они  и  были,  оболочки  вроде Bash и Zsh имеют более быстрые альтернативы  функций  POSIX,  поэтому  справедливо  ли  их  сравнивать?  Мы  запустили  тестовый  скрипт  с  несколькими  циклами,  содержащими  парочку  логических  тестов,  чтобы определить относительную скорость.  Поскольку некоторые оболочки используют  нестандартный синтаксис скриптов, ранжировать их не удалось, но там, где скорость  достойна упоминания, она отмечена в индивидуальных обзорах. 

Тестирование  производилось  на  ПК Athlon64  3200  с  1  ГБ  ОЗУ,  и  на  1-ГГц  G4 iBook  с  768MB,  на  обоих  был  установлен Gentoo Testing.

Bash

Вначале был Bourne Shell (sh), его написал Стивен Борн [Steven Bourne] для Bell Labs Research Unix. Bash – это Bourne Again Shell (Снова Оболочка Борна), ужасный каламбур, который, к счастью, редко используется. Почти все современные дистрибутивы Linux используют Bash в качестве оболочки по умолчанию, и вы, вероятно, знакомы как минимум с его основами; это превращает Bash в фактический стандарт, с которым сравниваются все остальные. Поэтому имеет смысл для начала рассмотреть Bash, а затем перейти к другим оболочкам, изучить, чем они отличаются, и выделить их достоинства и недостатки. Итак, что же дает нам Bash, и почему Bash столь популярен у разработчиков дистрибутивов?

Дело не в малом размере Bash, и не в скорости. По размеру Bash больше всех рассмотренных здесь оболочек, кроме одной: Sash, которая не использует библиотек и имеет несколько дополнительных встроенных команд. Bash также и не самая быстрая оболочка, которую вы встретите (если, конечно, не отшвырнете журнал, проигнорировав остаток нашего Сравнения и поклявшись всю оставшуюся жизнь пользоваться только Bash). Однако большинству пользователей на это наплевать, ибо подлинно важна его гибкость. Bash обладает некоторыми функциями, превосходящими стандарт POSIX, хотя при желании можно добиться от него и POSIX-поведения. Если запустить Bash командой sh, с опцией командной строки --posix или при установленной переменной окружения POSIXLY_CORRECT, Bash будет работать как стандартная оболочка POSIX. При запуске через sh, Bash по возможности пытается работать как исходная оболочка Борна, но лишь в тех ситуациях, когда это не вступит в конфликт со стандартом POSIX.

Встроенные команды позволяют Bash выполнять некоторые операции быстрее, ценой чуть более долгого времени загрузки, но если вы запускаете скрипт Bash из оболочки Bash, об этом и говорить не стоит. Эти команды плюс дополнительные логические конструкции означают, что скрипты, написанные для Bash, могут работать быстро. Например, типичный способ запустить цикл с установленным количеством повторений – for i in $(seq 1 100), при этом внешняя команда seq генерирует список повторений. С помощью Bash вы можете написать for i in {1..100}, при этом не вызывается никакая внешняя программа и все выполняется быстрее.

RTFM

Набрав help, вы получите список всех встроенных команд. Добавив имя команды, вы получите информацию об ее использовании. Это устраняет необходимость лазить по man-странице Bash, содержащей явный переизбыток информации. Тут Bash может поучиться у Zsh, где документация распределена по нескольким страницам. Документация, представленная в формате info, удобнее для обработки, при условии, что вы умеете пользоваться info, но многим из нас это недоступно. Пользователи KDE могут легко просмотреть документацию, введя ‘info:Bash’ в Konqueror.

Как и большинство оболочек, Bash включает функцию стандартного tab-дополнения: нажмите Tab на первом слове, и он попытается дополнить его до имени команды, нажмите Tab на следующем слове, и он попробует дополнить его до имени файла или пути. Однако в плане программируемого дополнения Bash может пойти намного дальше. Как только вы установите и добавите в свой профиль дополнительный пакет из http://www.caliban.org/Bash/index.shtml#completion , функция tab-дополнения будет завершать переменные в соответствии с командой, за которой они следуют. Например, введите ssh, а потом несколько первых букв имени хоста в вашей сети, и Bash дополнит его на основе содержимого вашего файла SSH known_hosts. Программируемое дополнение также можно использовать в качестве командной опции; введите somecommand --TAB – и увидите список опций, доступных в этой программе. Дополнение работает и с неопциональными аргументами для программ. Все это, конечно, чудесно, но не забудьте, что у программ должна быть специальная поддержка: обычно это файл в /usr/share/Bash-completion. Некоторые из них прилагаются, а некоторые доступны онлайн.

Легко понять, почему разработчики дистрибутивов так любят Bash. Во внутренней работе системы многое (например, все скрипты сервисов, запускаемых при включении и выключении) требует эффективного использования сценариев оболочки, и удобно программируемый Bash обречен на сильную любовь – да такую сильную, что некоторым дистрибутивам эта оболочка требуется в обязательном порядке, и без нее они работать не будут. Впрочем, вы не обязаны выбирать себе Bash в качестве интерактивной оболочки. Конечно, в нем широкий спектр функций и налицо удобство использования, но если вы просто получили Bash вместе с дистрибутивом и не пробовали ничего другого – читайте дальше и, возможно, найдете что-нибудь получше!

Fish

Работа с оболочкой слегка пугает начинающих пользователей. Поэтому Fish, Friendly Interactive Shell (Дружелюбная Интерактивная Оболочка), даже предлагает привыкшим к графическому пользовательскому интерфейсу ввести help после входа. Эта команда при первом использовании попросит вас выбрать браузер, а потом будет открывать в нем документацию в формате HTML. Подробная и доступная информация о командах делает их поиск значительно проще, чем в man-страницах оболочек, подобных Bash или Zsh. Если Fish не сможет подключиться к X-серверу, для показа справки будет задействован links.

Документация – не единственная дружелюбная функция в Fish. Здесь также используется подсветка синтаксиса: когда вы начинаете вводить команду, буквы показаны красным, и меняют цвет на зеленый при правильном завершении имени команды, а имена действующих директорий подчеркиваются. По ощущениям (без измерений), Tab-дополнение вроде бы быстрее, чем в Bash, и почти не уступает программируемому дополнению Bash, но не столь расширяемо; оно работает над командными опциями, так же, как и над самими командами. Предыстория команд тоже более интуитивна: просто введите начало команды и нажмите стрелку «вверх», чтобы просмотреть предыдущие вызовы – это проще, чем запомнить Ctrl-R и иже с ним.

Fish использует специфические конструкции скриптов, которые проще для понимания начинающих пользователей, но несовместимы с другими оболочками. Это не фатальный недостаток, потому что Fish предназначен для интерактивного использования, хотя эти конструкции также могут использоваться в командной строке. В защиту Fish можно сказать, что он ориентируется на тех, кого вряд ли интересуют подобные функции, и достаточно гуманен, чтобы подробно объяснить, почему первая форма не работает, и привести пример корректного (для Fish) формата. Да, Fish избавился от некоторых загадочных приемов в стиле Unix, но вам все же придется держать под рукой Bash, чтобы запускать системные скрипты.

Tcsh

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

Как и Bash с Zsh, Tcsh использует по умолчанию привязку клавиш в стиле Emacs, но при желании ее можно переключить на vi (фанаты vi, не принимайте, пожалуйста, это за восхваление Emacs, и не развязывайте очередную религиозную войну редакторов). Tcsh не предлагает программируемого или опционального дополнения, как Zsh или Bash, однако у него есть функция проверки написания команд, директорий и переменных среды. Вилфредо Санчес [Wilfredo Sanchez], бывший ведущий инженер Mac OS X, работал над Tcsh в начале 1990-х в MIT, и неудивительно, что ранние версии Mac OS X поставлялись с Tcsh в качестве оболочки по умолчанию; но потом в Panther-версии ОС его заменили на Bash.

Употребление псевдонимов-алиасов здесь более гибкое, чем в других оболочках, где не дозволяются никакие подстановки. Tcsh с подстановками справляется, поэтому аргументы, переданные псевдониму, можно послать «по цепочке» реальной команде, создавая своего рода мини-функции. Такое вряд ли понравится пользователям Bash и Zsh: к этому надо попривыкнуть, чтобы осознать, насколько оно полезно.

Основное различие между Tcsh и другими оболочками – синтаксис языка сценариев. Как и подразумевается в названии, он напоминает язык С, и хотя циклы foreach и while действуют схоже, синтаксис совершенно другой, и из-за него скрипты Tcsh несовместимы с другими оболочками. В нем также используются конструкции, которые вы не найдете в традиционных скриптах; среди них – безусловно полезный switch и сомнительный goto.

Zsh

При первом запуске Zsh выводится меню настройки, чтобы вы смогли отрегулировать многочисленные мощные и гибкие функции. Все меню содержат массу информации по каждой опции и предлагают разумные значения по умолчанию, поэтому вы можете просто принять их и, если пожелаете, запустить программу настройки позже, когда вам понадобится вся функциональность. Zsh снабжен всеми функциями, которые только можно придумать, и даже сверх того – например, проверкой написания. Zsh и Bash предлагают сходный функционал. Обе имеют программируемое дополнение (хотя у Zsh оно появилось раньше), встроенные команды и функции для создания скриптов. У Zsh также в запасе есть несколько собственных хитростей, например, расширенная подстановка имени файла, которая превращает команду поиска find почти что в ненужное излишество. Включение в путь ** означает соответствие любому символу, включая разделитель-слэш, поэтому **/*.jpg касается всех файлов *.jpg в текущей директории и в любых поддиректориях. Мало того, сюда также включаются права доступа к файлу, владелец, тип или отметка времени – большинство опций, предусмотренных find. Например, можно использовать ls -l /**/bin/*(s) для вывода списка всех setuid-файлов в /bin, /usr/bin и /usr/local/bin. Где вы, наши друзья по старым добрым временам Amiga – при наборе имени директории в командной строке Zsh переключается на эту директорию. Многие из нас годами приучались ставить cd перед именем директории; теперь можно поставить Zsh и вернуться к былой лени.

Программируемое дополнение в Zsh аналогично той же функции в Bash, описанной выше. Можно дополнить аргументы команды, нажав Tab, или включить дополнение имен пользователей или хостов, набрав ssh. Поскольку Zsh – программируемая оболочка, ее можно расширять сколько душе угодно. Обычный пример – ограничение дополнения имен файлов только теми расширениями, которые способна обработать вводимая команда: так, команда mplayer TAB выведет список всех MPG- и AVI-файлов в текущей директории, подобным же образом обрабатываются и другие формы, с которыми она работает, например, dvd:// и tv://; при этом текстовые документы в той же директории игнорируются.

Без сомнения, Zsh – невероятно мощная оболочка. Выполнение скриптов в основном быстрее, чем в Bash – по большей части примерно на 20% – однако Zsh разработан для интерактивного пользования. Превосходит ли он Bash? Почти наверняка, особенно если учесть расширенную подстановку имени файла и более развитую опцию дополнения.

Dash

Если вы ищете небольшую и быструю оболочку, то у Dash есть шансы. Dash происходит от оболочки FreeBSD под названием Ash, и, имея скромный размер 99K, составляет всего одну седьмую от Bash. В нем нет тех наворотов, которыми богат Bash, но они не всегда и нужны. Как интерактивная оболочка, Dash скудноват – здесь нет даже базового tab-дополнения; но он превосходно подходит для выполнения сценариев оболочки POSIX.

Dash почти совместим с POSIX, но кое-какие несовместимости в нем, похоже, имеются, поэтому стоит прочитать документацию и уточнить, какие именно. Однако он сработается с большинством скриптов, использующих /bin/sh (любой скрипт, обращающийся к /bin/ sh, не должен требовать ничего сверх минимума, гарантированного оболочкой POSIX).

Маленький размер также помогает проворности Dash. Понятно, что он способствует ускорению и загрузки, и работы скриптов; по сравнению с Bash наш тестовый скрипт запустился вдвое быстрее. «Махнув» Bash на Dash в символьной ссылке /bin/sh, вы значительно сократите время загрузки, в течение которой обычно запускается множество сценариев оболочки. Однако, прежде чем это сделать, убедитесь, что у вас не возникнет проблем, способных помешать загрузке. Хороший способ обезопасить себя от внезапных «ударов под дых» – предварительно проверить все init-скрипты вручную.

Dsh

Dsh – это распределенная оболочка (хотя вообще-то ее название означает Dancer’s Shell), выполняющая команды сразу на нескольких удаленных машинах. Некоторые рассмотренные здесь оболочки подходят для интерактивного пользования и создания скриптов; а эта – совсем не интерактивна, но зато весьма полезна, когда надо запустить серию команд на группе компьютеров. Альтернативой является нечто вроде

for host in node1 node2 node3; do ssh 
    $host “my commands”; done

С Dsh, вы заносите имена хостов в файл machine.list, а затем просто набираете Dsh -a my commands. Файл machine.list используется опцией -a (или --all), но вы можете поместить любое количество списков имен хостов в групповой директории Dsh, и, передав имя списка с помощью опции -g (--group), запустить команду на всех этих машинах.

Опции включают: запуск команд на удаленных хостах последовательно или параллельно, предварение каждой строки вывода именем хоста (что особенно полезно при параллельном запуске команд); и передача команд через стандартный ввод. Команды можно запускать с помощью ssh или rsh, но для должного использования ssh вам понадобится аутентификация по ключу, а для выполнения команды от имени другого пользователя ее нужно будет предварить названием соответствующей учетной записи.

Это – действительно полезный инструмент при работе с группой машин. В нем не хватает только возможности одновременного копирования файлов на несколько компьютеров. Чтобы вытащить файлы с вашего компьютера, вы можете запустить команду scp на других машинах, но это предполагает, что вы предоставите всем им SSH-доступ к вашей рабочей станции – маловероятный сценарий, в особенности если компьютеры-получатели являются общедоступными серверами. Добавка dcp может превратить Dsh в отличный инструмент администрирования.

Sash

Sash – это просто самая крупная из рассмотренных здесь оболочек, и не без причины. Ее название – сокращение от Stand Alone Shell (Оболочка-одиночка), и в ней содержится несколько встроенных команд, которых нет ни в одной другой оболочке. Когда мы скажем, что эти команды – mount, ls, cp, tar и gzip, вы поймете, для чего нужен Sash. Это – оболочка для восстановления системы, которая работает даже тогда, когда большая часть вашей файловой системы утрачена. Если /boot у вас находится на отдельном разделе, и вы не монтируете его при загрузке, или монтируете в режиме только для чтения, поместите на него копию Sash, и выдержите даже rm -fr /*. Используя встроенные команды Sash, вы сможете восстановить свои резервные копии (у вас ведь есть резервные копии, правда?) и запустить работу снова, не теряя времени. После отказа системы восстановление возможно даже при отсутствии важных библиотек: все необходимое – это ядро и Sash.

По причине ограничений на размер, команды, встроенные в Sash, являются урезанными версиями своих аналогов, поэтому Sash предоставляет доступ и к тем, и к другим. Для запуска стандартной команды ls вводите ls, а -ls вызовет встроенную. Стандартная команда недоступна? Сделайте псевдоним ls, разворачивающийся в -ls. Если вас угораздило полностью удалить /bin, используйте aliasall, и все команды будут выбираться из встроенных. Того же можно добиться, запустив Sash с опцией -a. Команда help выведет список встроенных команд и информацию по использованию любой из них.

Sash также умеет запускать скрипты с помощью опции -f, а значит, вы можете автоматизировать даже процесс восстановления. Если безобразия у вас творятся часто – настолько, чтобы вам захотелось автоматизировать использование Sash для этих целей – возможно, стоит пересмотреть и изменить свой подход к работе. Sash вряд ли подходит на роль стандартной интерактивной оболочки, но он из тех приложений, наличие которых под рукой приведет вас в состояние дикой радости, если с вами стряслось то, что бывает только у других.

Вердикт

Zsh 9/10

Группа программ, представленных в данном Сравнении, довольно необычна, потому что в ней есть программа, уже установленная практически в каждом дистрибутиве.

Вышло так, что Zsh победил фактически по всем параметрам: он быстр, достаточно компактен, имеет превосходную документацию и лучшее дополнение, чем любая из представленных здесь оболочек. Если вы прежде не использовали tab-дополнение в оболочке, попробуйте: время здорово экономится. При интерактивном использовании Zsh непревзойденна, благодаря своим функциям и дружелюбию ко всем, кто познакомился с документацией. Нужны еще аргументы? Что ж, автор уже сделал Zsh оболочкой по умолчанию вместо Bash.


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

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

Dash примечателен небольшим размером и быстротой, но более, собственно, ничем. Он пригодится тем, кому надо поторопить медленное оборудование. Dsh – не похож на остальные, но может стать мечтой сетевого администратора – если кроме выполнения команд даст возможность распределенного копирования файлов.

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

Sash заслуживает особого упоминания, несмотря на низкий рейтинг. Он заработал 5 из 10 только потому, что в сравнении с остальными участниками предлагает слишком мало, за исключением одного: ему вообще ничего не надо, чтобы запуститься. Никому и в голову не придет использовать его в качестве стандартной оболочки, но Sash надо держать в надежном месте; возможно, когда-нибудь он станет вашей палочкой-выручалочкой.

Краткая история оболочек

В начале был sh, известный также, как Оболочка Томпсона (Thompson Shell) – оболочка, появившаяся вместе с первым Unix в 1971 г. Он предназначался только для выполнения команд, не для скриптов. Шесть лет спустя его вытеснила Оболочка Борна (Bourne Shell), которую тоже назвали sh. Обе оболочки вышли из Bell Laboratories. В Bourne Shell появились скрипты и прочие инновации, например, командная подстановка, использующая обратный апостроф

(VAR=`command --arg`).

Оболочка Корна (Korn Shell, ksh) также была разработана в Bell Labs (может, AT&T – их владелец – на самом деле корпорация оболочек?). Она была совместима с Bourne Shell, и в ней добавилось еще больше функций, включая расширенные скрипты и такие вещи, как предыстория (журнал) команд. Если вы когда-нибудь работали с оболочкой без журнала команд – как изначальная оболочка Amiga, например – вы поймете, какой это был гигантский скачок.

Bash основана на Bourne Shell, а на создание Zsh вдохновила Korn Shell, но благодаря стандарту POSIX оба отлично сотрудничают.

Таблица функций

Лицензия Размер исполняемого файла Tab-дополнение Раширенное дополнение Детализация Онлайн-справка POSIX-совместимость Проверка написания
Bash GPL 2 41k v v v v v x
Dash BSD 80k x x x v x x
Dsh GPL 2 21k N/A N/A v x N/A x
Fish GPL 2 318k v v v v x x
Sash Свободно распространяемая 971k v x v v x x
Tcsh BSD 326k v x v x x v
ZSH ZSH 511k v v v x v v
Персональные инструменты
купить
подписаться
Яндекс.Метрика