Bash используется по умолчанию в каждом дистрибутиве Linux, который я пробовал, по сравнению с альтернативами, такими как Z shell (zsh). Есть ли техническая или историческая причина для этого?
9 ответов
История (приобретенная не в результате исследований, а в результате того, что мы проводим слишком много времени с людьми из Bell Labs):
В начале (если вы считаете начало Unix версии 7) была оболочка Bourne. Стив Борн был первым, кто показал, что оболочка, которая контролирует взаимодействие с пользователем, может быть пользовательской программой, а не особой частью операционной системы. Исторический прорыв. Сама оболочка была относительно чистой для написания сценариев, но не имела редактирования в командной строке или управления заданиями. Введение Борна в Unix Shell все еще полезно для начинающих пользователей сегодня.
Редактировать: я проигнорировал некоторые "предыстории" от Кена Томпсона и Джона Маши, также из Multics. Я уверен, что Борн знал обо всей этой работе (он был в той же лаборатории, 1127, в Bell Labs), но оболочка Борна была окончательной, и более ранняя работа имела небольшое влияние, за исключением интерпретации Стива Борна. Например, хотя Кен позже написал компилятор Plan 9 C и оказал большое влияние на Plan 9, но в статье Тома Даффа об оболочке Plan 9 упоминается только оболочка Борна, а не Томпсона.
Оболочка - это просто пользовательская программа, так что любой может ее написать. Когда Unix версии 7 создавался в Нью-Джерси, Unix Berkeley создавался в Калифорнии. Билл Джой в Беркли написал
csh
, оболочку Си. Джой добавил управление заданиями и историю, а затем редактирование в командной строке, но не знал о работе Борна и поэтому основывал свой язык на оболочке Томпсона (которую я считал "доисторической" в предыдущей статье). Сообщество Unix любило контроль работы, но им также нравился язык Борна. Для не особенно хорошей полемики против языка csh, см. Программирование на Csh считается опасным. Некоторое время многие люди использовалиcsh
интерактивном режиме для функций управления заданиями и истории, но использовалиsh
для Борна для написания скриптов. Эта ситуация была не идеальной.Редактировать: Спасибо DigitalRoss за то, что выправили меня в хронологии
csh
. Так как я получил образование от людей, которые называют BSD "ересью Беркли", у меня было мало фактов там.Дейв Корн из Bell Labs сделал блестящую реинжиниринг оболочки Борна, чтобы произвести оболочку Корна (ksh). Он был полностью обратно совместим с Bourne shell
sh
но обеспечил множество бесценных улучшений.ksh
стал основой стандарта POSIX и был поставлен с программным обеспечением Sun. (И это несмотря на то, что Билл Джой покинул Беркли, чтобы помочь основать Sun, и был одним из их ведущих разработчиков программного обеспечения.)Bell Labs и AT & T тупо не в состоянии сделать
ksh
открытым исходным кодом.ksh88
широко используется, но наличие источников не является законным. Некоторые люди становятся настолько зависимыми, что становятся цифровыми преступниками.Редактировать: Это действительно было так глупо? Трудно знать. Беркли уже отдавал Unix, и вскоре последовали другие корпорации, но это была еще та эпоха, когда Corporate Masters верили в то, что стоит брать плату за Unix. Но результаты: AT & T Unix мертва, после того, как ее продали различным сторонам сколько угодно раз. BSD и его производные живы и здоровы, но эти выскочки, называемые "Linux" и "GNU", имеют огромную долю разума, которая когда-то принадлежала Bell Labs.
Free Software Foundation делает "чистую комнату", с нуля внедряя оболочку POSIX, принимая все идеи Дэйва Корна как текущие, плюс в обычном стиле FSF добавляя свои собственные новые функции, такие как программируемое завершение. Они называют это оболочкой "Bourne again", или
bash
.В середине 1990-х AT & T открыла исходные
ksh93
, но к тому времени уже слишком поздно для широкого распространения. Лицензионное соглашение странно нестандартно.bash
иksh
расходятся, иksh
никогда не достигает доли рынка, соответствующей его месту в истории.
Уроки:
Первый адекватный продукт на рынке выигрывает (ш).
Люди любят новые функции (управление заданиями, выполнение команд), но они любят их еще больше, когда их старые сценарии продолжают работать.
Редактировать: профессора инженерии должны оставить историю историкам науки :-)
У Bash есть две совершенно разные вещи.
Это хорошая оболочка. Это может быть одна из двух оболочек (другая - zsh), в которую интегрированы некоторые классные функции
csh
такие как!
подстановка истории в синтаксис posix. Он имеет множество расширений, включая массивы.Это оболочка FSF/GNU. В мире с открытым исходным кодом это дает своего рода кеш.
Я должен также добавить, что это не всегда по умолчанию. ash
часто используется как /bin /sh, так что, хотя bash
может быть интерактивной оболочкой, ash
это оболочка "просто запустите командный файл". Это потому, что ash
меньше и быстрее, и содержит функции posix, так что это правильное подмножество. Использование ash
в качестве интерактивной оболочки иногда проблематично. На NetBSD, скажем, он работает хорошо, потому что там он построен со всеми функциями. Это своего рода оболочка, тогда как bash
- это внешний пакет. Но в Linux ash
обычно считается неинтерактивным, поэтому они компилируют его без истории и без (важного) редактирования строки о том, что он просто используется для запуска этих огромных скриптов gnu configure
.
Сказка о двух раковинах
Реальная история снаряда
ОБНОВЛЕНИЕ: Существует неточная история копирования оболочки с места на место в сети, и люди по понятным причинам верят в это. Я постараюсь дать точную версию и предоставить несколько ссылок, чтобы подтвердить это здесь.
- Первая оболочка, скорее всего, не была оболочкой Борна, но была написана самим Кеном Томпсоном и распространена в V6, версии AT & T, разосланной в различные университеты и правительственные лаборатории. Это то, что поставило Unix на карту. У него были все основы,
<, >, >>, |, &
, но он просто имел простой синтаксисgoto
control через внешнюю программу, которая искала стандартный ввод. Тогда не было сложных сценариев оболочки. Более поздние оболочки открывали ввод команды на отдельном fd. Сегодня это может показаться простым, но в фильме ужасов 1970-х годов это была лучшая вещь на земле. Хотите верьте, хотите нет, но эта древняя оболочка имеет свой собственный твиттер-поток сегодня и, конечно же, домашнюю страницу. - Второй оболочкой был
csh
, написанный (как иvi
) Биллом Джоем из UCB. Это было до GNU readline и NetBSD editline, поэтому, казалось, было вполне разумно делать историю с!
синтаксис. Csh добавил большинство современных функций оболочки, но с синтаксисом csh. csh не менял синтаксис , безвозмездно или иным образом. Он был обратно совместим с оболочкой Томпсона и изначально содержал исходный код TS. - Третья оболочка была оболочкой Борна с другим синтаксисом. Unix разрабатывался параллельно в UCB и AT & T. Эта оболочка имела странный распределитель памяти (я думаю, что она просто использовала больше памяти, перехватила SIGSEGV, сделала новый brk (2), а затем повторила попытку), что затрудняло работу на новых портах Unix, поэтому
osh
иcsh
оставались популярными для когда-то. Интернета не было, и он был лицензирован SW, поэтому в такой среде Стивен Борн мог не знать об оболочке Джой и, конечно же, Джой не знал о Борне. Вполне возможно, что две оболочки впервые встретились, когда UCB получил VAX и предварительный выпуск забытого Unix/32V. Я помню, как Билл жаловался на распределение памяти. Обратите внимание, что обе оболочки были обратно совместимы с оболочкой V6 , они просто расширяли синтаксис в разных направлениях. - Теперь действительно было несколько несовместимых оболочек, к которым AT & T добавила Bshne-совместимый
ksh
. В конце концов, уcsh
был полу-доступный исходный код, но он был связан в судебном процессе между AT & T и Калифорнийским университетом. Тем не менее, это были славные дни BSD Unix, поскольку сложные компании, которые могли позволить себе плату в 50 000 долларов, купили бы лицензию AT & T, но установили дистрибутивы BSD 4.x, и университеты получили ее бесплатно. - В этой ситуации со многими юридическими и техническими вопросами были предприняты различные независимые реализации. С синтаксисом
csh
пошло столько же, сколько и с синтаксисом оболочки Bourne, а некоторые объединили их. У тебя был хотя быtcsh
,zsh
,bash
иash
. Синтаксис Bourne был "официальным", будучи частью релизов AT & T, но в те дни BSD был очень важен, и Sun, первоначально BSD, распространяла изрядное количество Unix SW, с которым столкнулся мир. - Частично из-за иска USL у FSF и Linux было открытое поле. Между тем, AT & T удалось начать борьбу с одним из немногих юридических лиц на земле, больше, чем они (штат Калифорния), и, в конце концов, они не выиграли иск, и в итоге распределение BSD стало законным. подбетонка. Но к тому времени Linux и bash были повсюду, и сегодня BSD - это ниша.
- Наконец, bash - это хорошая оболочка (хотя, по всей видимости, она отрицалась в частном порядке ее первоначальным автором), и она полностью заслуживает похвалы за свой собственный успех. csh затмил бы csh и zsh, даже если ash, bash и ksh не выиграли синтаксическую войну.
Чтобы добавить к тому, что @DigitalRoss сказал
- Bash - полная замена надмножества posix-sh, даже в том случае, если он вызывается как /bin /sh, он будет полностью эмулировать posix-sh. Posix-sh был "стандартом" для коммерческих систем Unix как оболочка с общим знаменателем. Итак, что-то, что начинается там и строится на нем, начинается с большого.
Потому что Linux - это просто ядро (и необходимая поддержка), в то время как GNU предоставляет (или предоставлял) все основные программные клоны Unix, которые делают то, что мы называем "Linux", пригодным для использования. Bash - это оболочка проекта GNU, написанная как клон старой оболочки Bourne (sh) из Unix версии 7.
Согласно опросу unix.com, это не намного дальше, чем ksh.
/bin/sh 83 8,96%
/bin/csh 36 3,89%
/bin/ksh 370 39,96%
/bin/tcsh 36 3,89%
/bin/bash 401 43,30%
Bash широко известен благодаря своему богатому набору функций. Он также принимает функции от других оболочек, таких как C-shell и Korn-shell. Пожалуйста, взгляните на эти функции.
Потому что 'bash' совместим на 100% 'sh/ksh', а 'ksh' - это оболочка POSIX.
Так что если вам нужна POSIX-совместимая система и вы работаете в Linux, тогда вы используете bash.
Если вы работаете в коммерческом Unix, вы обычно получаете ksh в качестве оболочки по умолчанию (иногда просто старый sh). По какой-то причине Sun по-прежнему использует по умолчанию flakey csh.
Преимущество заключается в переносимости. .Sh, написанный для hp-ux или AIX, имеет хорошие шансы работать в качестве linux 'bash' без каких-либо изменений.
И добавить ко всем остальным ответам: zsh
не имеет обратной совместимости. Вы, вероятно, можете настроить его так, чтобы он был совместимым, но тогда вы теряете его возможности.
Я использую zsh
как свою обычную интерактивную оболочку, но bash
/dash
кажутся мне более разумными в качестве языков сценариев оболочки; они делают меньше магии и более предсказуемы ... это более важно для меня, когда я пишу сценарий, который должен работать в течение нескольких лет.
Просто чтобы запутать дело, команда sh
иногда является просто символической ссылкой на другую программу оболочки, такую как ash
, bash
или dash
.
Ubuntu раньше связывал его с bash
, поскольку bash
предназначен для запуска любого совместимого сценария оболочки Bourne.
Тем не менее, недавно Ubuntu перешел на использование sh
link для dash
. dash
предназначен для запуска сценариев bash
(и, следовательно, также сценариев sh
), но он предназначен для использования только для сценариев, поэтому в нем отсутствуют интерактивные функции bash
. Это делает его меньше и (возможно) быстрее.