Какие бывают шеллы
Большая часть командных оболочек делится, на основе синтаксиса интерпретируемого ими языка, на две группы -- sh- и csh-совместимые. На самом деле различия между ними синтаксисом команд не исчерпываются, а лежат глубже -- в подходе к обработке командных конструкций, к чему мы ещё вернёмся.
Оболочки, относимые к sh-совместимым, происходят от первой командной оболочки первых Unix-систем, которую так и называют -- shell или Bourne Shell (то есть шелл Борна). В ней были заложены многие возможности для интерпретации команд и их конструкций, то есть составления системных и пользовательских сценариев. Однако по своим интерактивным возможностям
она оставляла желать лучшего, и потому на базе ее была создана оболочка Корна (Korne Shell).
Шелл Корна сохранил совместимость с борновским шеллом на уровне синтаксиса, однако привнес в него как дополнительные возможности интерпретации команд, так и приёмы, направленные на удобство интерактивной работы. И потому именно он лёг в основу стандарта POSIX, которому должны удовлетворять командные оболочки совместимых с ним систем.
Следует заметить, что соответствие этому стандарту -- один из критериев отнесения некоей ОС к семейству Unix или Unix-подобных. В частности, именно такой стандартизированный шелл должен вызываться при исполнении общесистемных сценариев инициализации любой POSIX-системы. Сам же по себе POSIX shell -- некая мифическая абстракция. Ближе всего к ней подходят /bin/sh
-- умолчальная пользовательская оболочка из FreeBSD, и ash
, принятая в качестве стандартной в NetBSD (а также широко используемая во всяких мини-дистрибутивах Linux).
Шеллы и Борна, и Корна не были свободно распространяемыми программами в терминах GPL-совместимых лицензий. Поэтому ни тот, ни другой не могли использоваться в таких ОС, как *BSD или Linux, хотя свободная реализация оболочки Корна (pdksh) и была создана. Однако, как и ее прототип, шелл Корна, она, несколько развившись относительно первозданного Bourne shell, обладала интерактивными достижениями, уже далекими от идеала. Столь же слабы они были и в ash
. И потому наиболее широкое распространение из всего sh-совместимого семейства получила оболочка bash
(что расшифровывается как "ещё одна оболочка Борна", "заново рожденный шелл" и тому подобным образом), разработанная в рамках проекта GNU.
Популярность bash
в немалой степени была обусловлена его интерактивными возможностями -- он аккумулировал все достижения интерактивной мысли sh- и csh-совместимых оболочек, прибавив к ним немало собственных. И умудрившись при этом сохранить базовую совместимость с POSIX shell. Конечно, многие его собственные особенности (так называемые "bash'измы") выходили за рамки этого стандарта. Однако для соответствия оному был предусмотрен режим совместимости -- то есть bash
был способен эмулировать стандартный POSIX shell.
Однако главным для популярности bash
было то, что эта оболочка оказалась тесно интегрирована с операционной системой Linux: именно bash
волею судеб стал одной из первых программ, которые Линус запустил поверх своего новосозданного ядра. И потому идеи bash-скриптинга пронизали Linux до самых его оснований. Ну а для совместимости использовался тот самый режим эмуляции: в Linux файл, запускающий POSIX shell (по стандарту он должен именоваться /bin/sh
), являет собой жесткую или символическую ссылку на реальный /bin/bash
. Последний же, будучи вызванным таким образом, полностью воспроизводит функционально стандартный POSIX shell (разумеется, путем утраты своих продвинутых функций).
Клан csh-совместимых оболочек развивался параллельно сынам и пасынкам Борна. Собственно оболочка csh
(или C-shell) была создана в Университете Беркли на начальных этапах реализации проекта BSD Unix. Первым ее разработчиком был Билл Джой -- автор также и культового текстового редактора юниксоидов, vi
, а в последующем один из основателей фирмы Sun.
Оболочка C-shell получила дополнительные интерактивные возможности, во многом превосходящие таковые не только у современного ей шелла Борна, но и появившегося позднее шелла Корна. Главное же -- языку, ею интерпретируемому, были приданы черты синтаксического сходства с языком Си (откуда, собственно, и название -- C-Shell, хотя не следует думать, что на всамделишний Си ее интерпретируемый язык похож). В результате оболочка csh
оказалась весьма эффективной как для интерактивной работы, так и при создании сценариев. Только вот сценарии эти не были совместимы со скриптами POSIX shell, обретшего уже силу стандарта. То есть, при всей эффективности пользовательского шелл-программирования, для создания общесистемных сценариев она оказалась практически непригодной.
В отличие от большинства прочих достижений берклианской мысли, оболочка csh
, по не вполне ясным для меня причинам, не обрела статуса свободной программы. Поэтому она не могла использоваться даже в своих родных пенатах -- в BSD-системах. Однако на замену ей была изобретена свободная оболочка tcsh
-- не просто функциональное воспроизведение, но и дальнейшее развитие оболочки csh
. По интерактивным возможностям она, как минимум, не уступает bash
и потому прочно утвердилась в стане свободных BSD-клонов как пользовательский шелл по умолчанию.
В частности, оболочка tcsh
принята в качестве login shell
для суперпользователя во FreeBSD. Правда, вызывается она в режиме совместимости с csh
, однако /bin/csh
-- не более чем жесткая ссылка на /bin/tcsh
.
Оболочка tcsh
используется в качестве универсального "умолчального" пользовательского шелла также в OpenBSD и DragonFlyBSD. Однако характерно, что все общесистемные сценарии в обеих ОС написаны, тем не менее, в соответствие с требованиями POSIX Shell, и нтерпретируются посредством стандартного /bin/sh
.
Апофеозом же развития шеллов стал zsh
. Принадлежа семейству sh-совместимых оболочек, он, на уровне конфигурационных файлов, обладает и некоторой совместимостью с csh-семейством. Инкорпорируя все возможности, достижимые в bash
и tcsh
, он обнаруживает такое богатство интерактивного функционала и средств скриптинга, какие не снились обеим этим оболочкам, вместе взятым. При этом он полностью сохраняет совместимость со стандартом POSIX shell при запуске в режиме эмуляции последнего.
Содержание . .