Почему Bash везде (в большинстве, если не во всех дистрибутивах Linux)?

50

Bash используется по умолчанию в каждом дистрибутиве Linux, который я пробовал, по сравнению с альтернативами, такими как Z shell (zsh). Есть ли техническая или историческая причина для этого?

hoju
источник
1
Это не. В моей системе FreeBSD tcsh является оболочкой по умолчанию!
54
Ваша система FreeBSD не является дистрибутивом Linux.
8
Не дай Бог, между дистрибутивами есть некоторая последовательность ...
OMG Ponies
4
Нет, но он принадлежит "везде" :)

Ответы:

106

История (приобретенная не благодаря исследованиям, а проведя слишком много времени, проводя время с людьми из Bell Labs):

  1. В начале (если вы считаете начало Unix версии 7) была оболочка Bourne. Стив Борн был первым, кто показал, что оболочка, которая контролирует взаимодействие с пользователем, может быть пользовательской программой, а не особой частью операционной системы. Исторический прорыв. Сама оболочка была относительно чистой для написания сценариев, но не имела редактирования в командной строке или управления заданиями. Введение Борна в Unix Shell все еще полезно для начинающих пользователей сегодня.

    Изменить : я проигнорировал некоторые "предыстории" от Кена Томпсона и Джона Маши, также из Multics. Я уверен, что Борн знал обо всей этой работе (он был в той же лаборатории, 1127, в Bell Labs), но оболочка Борна была окончательной, и более ранняя работа имела небольшое влияние, за исключением интерпретации Стива Борна. Например, хотя Кен позже написал компилятор Plan 9 C и оказал большое влияние на Plan 9, но в статье Тома Даффа об оболочке Plan 9 упоминается только оболочка Борна, а не Томпсона.

  2. Оболочка - это просто пользовательская программа, так что любой может написать ее. Когда версия 7 Unix создавалась в Нью-Джерси, Berkeley Unix создавалась в Калифорнии. Билл Джой в Беркли написал csh, C shell. Джой добавил управление заданиями и историю, а затем редактирование в командной строке, но не знал о работе Борна и поэтому основывал свой язык на оболочке Томпсона (которую я считал «доисторической» в предыдущей статье). Сообщество Unix любило контроль работы, но им также нравился язык Борна. Для не особенно хорошей полемики против языка csh, см. Программирование на Csh считается опасным . Некоторое время многие люди использовали cshинтерактивно для функций управления заданиями и истории, но использовали Борна shдля написания сценариев. Эта ситуация была не идеальной.

    Редактировать : Спасибо DigitalRoss за то, что выправили меня в хронологии csh. Так как я получил образование от людей, которые называют BSD «ересью Беркли», у меня было мало фактов там.

  3. Дейв Корн из Bell Labs сделал блестящую реинжиниринг оболочки Борна, чтобы произвести оболочку Корна (ksh). Он был полностью обратно совместим с оболочкой Bourne, shно обеспечил множество бесценных улучшений. kshстал основой стандарта POSIX и был поставлен стандарт с программным обеспечением Sun. (И это несмотря на то, что Билл Джой покинул Беркли, чтобы помочь основать Sun, и был одним из их ведущих разработчиков программного обеспечения.)

  4. Bell Labs и AT & T тупо не могут сделать kshopen source. ksh88широко используется, но наличие источников не является законным. Некоторые люди становятся настолько зависимыми, что становятся цифровыми преступниками.

    Редактировать : Это действительно было так глупо? Трудно знать. Беркли уже отдавал Unix, и вскоре последовали другие корпорации, но это была еще та эпоха, когда Corporate Masters верили в то, что стоит брать плату за Unix. Но результаты: AT & T Unix мертва, после того, как ее продали различным сторонам сколько угодно раз. BSD и его производные живы и здоровы, но эти выскочки, называемые «Linux» и «GNU», имеют огромную долю разума, которая когда-то принадлежала Bell Labs.

  5. Free Software Foundation делает «чистую комнату», с нуля внедряя оболочку POSIX, принимая все идеи Дэйва Корна как актуальные, плюс в обычном стиле FSF добавляя свои собственные новые функции, такие как программируемое завершение. Они называют это оболочкой "Bourne again", или bash.

  6. В середине 1990-х AT & T открыла исходные тексты ksh93, но к тому времени уже слишком поздно для широкого распространения. Лицензионное соглашение странно нестандартно. bashи kshрасходятся, и kshникогда не достигают доли рынка, соответствующей его месту в истории.

Уроки:

  • Первый адекватный продукт на рынке выигрывает (ш).

  • Люди любят новые функции (управление заданиями, выполнение команд), но они любят их еще больше, когда их старые сценарии продолжают работать.

  • Редактировать : профессора инженерии должны оставить историю историкам науки :-)

Норман Рэмси
источник
Я думаю, у вас действительно есть наиболее полное и точное объяснение популярности bash над всем остальным. Я видел среды, в которых по умолчанию используется zsh, и я ненавижу их, потому что весь синтаксис немного отклонен, и я не могу понять это, или я делаю ошибки.
Bullet (1) нуждается в исправлении: до того, как оболочка Bourne была оболочкой Mashey, а перед оболочкой Mashey была оболочка ur-Shell, оболочка Кена Томпсона. См en.wikipedia.org/wiki/Unix_shell
Jim Ferrans
2
Без особого обвинения Нормана, здесь есть много неточностей. Кен Томпсон написал первую оболочку, которая была единственной оболочкой V6 и использовалась параллельно в V7 и 32V. Стивен Борн не был «первым» автором оболочки, он переписал оболочку KT. У Csh не было управления заданиями до 4.1BSD, хотя это была первая оболочка, которая его получила. Csh не изменил синтаксис оболочки, он был обратно совместим с оболочкой V6, как и оболочка Bourne. Почти весь код был лицензирован в те дни. Что именно было глупо при взимании платы за лицензию для Unix?
DigitalRoss,
2
Я, наверное, не очень хорошо объясняю это, позвольте мне попробовать еще раз. Csh предшествовал Bourne или, по крайней мере, был параллельным внедрением на континенте. (До интернета это имело значение.) Иногда я сидел рядом с Биллом Джой в Кори Холле, когда он писал это; Я могу абсолютно заверить вас, что он написал это на V6. Как я уже сказал, csh (и Bourne) совместимы с V6-Thompson и обратно, поскольку это все, что существовало, когда они их писали. Конечно, это не Bourne-совместимый, таланты AFAIK Билла Джоя не включали видение будущего
DigitalRoss
1
Не bashвзял идею программируемого завершения от tcsh?
46

У Bash есть две совершенно разные вещи.

  1. Это хорошая оболочка. Это может быть одна из двух оболочек (другая - zsh), которая интегрирует некоторые интересные cshфункции, такие как !подстановка истории, в синтаксис posix. Он имеет множество расширений, включая массивы.

  2. Это оболочка FSF / GNU. В мире с открытым исходным кодом это дает своего рода кеш.

Я должен также добавить, что это не всегда по умолчанию. ashчасто используется как / bin / sh, так что, хотя это bashможет быть интерактивная оболочка, ashэто оболочка «просто запустите командный файл». Это потому, что ashон меньше и быстрее, и содержит функции posix, так что это правильное подмножество. Использование ashв качестве интерактивной оболочки иногда проблематично. На NetBSD, скажем, он работает хорошо, потому что там он построен со всеми функциями. Это своего рода оболочка, тогда bashкак это внешний пакет. Но в Linux ashэто обычно считают неинтерактивными, поэтому они компилируют его без истории и без (важного) редактирования строки о том, что он просто используется для запуска этих огромных gnu configureскриптов.

Сказка о двух раковинах

Реальная история снаряда

ОБНОВЛЕНИЕ: Существует неточная история копирования оболочки с места на место в сети, и люди по понятным причинам верят в это. Я постараюсь дать точную версию и предоставить несколько ссылок, чтобы подтвердить это здесь.

  1. Первая оболочка, безусловно, была не оболочкой Bourne, но была написана самим Кеном Томпсоном и распространена в V6, версии AT & T, разосланной в различные университеты и правительственные лаборатории. Это то, что поставило Unix на карту. Он имел все основы, <, >, >>, |, &но у него был простой gotoсинтаксис управления через внешнюю программу, которая искала стандартный ввод. Тогда не было сложных сценариев оболочки. Более поздние оболочки открывали ввод команды на отдельном fd. Сегодня это может показаться простым, но в фильме ужасов 1970-х годов это была лучшая вещь на земле. Хотите верьте, хотите нет, но эта древняя оболочка имеет свой собственный твиттер-поток сегодня и, конечно же, домашнюю страницу .
  2. Вторая оболочка была csh, написана (как это было vi) от Билл Джой в UCB. Это было до GNU readline и NetBSD editline, поэтому, казалось, было вполне разумно делать историю с !синтаксисом. Csh добавил большинство современных функций оболочки, но с синтаксисом csh. csh не менял синтаксис , безвозмездно или иным образом. Он был обратно совместим с оболочкой Томпсона и изначально содержал исходный код TS.
  3. Третья оболочка была оболочкой Борна с другим синтаксисом. Unix разрабатывался параллельно в UCB и AT & T. Эта оболочка имела странный распределитель памяти (я думаю, что она просто использовала больше памяти, перехватила SIGSEGV, сделала новый brk (2), а затем повторила попытку), что затрудняло работу на новых портах Unix, поэтому oshи cshоставалось популярным в течение некоторого времени , Интернета не было, и он имел лицензию SW, поэтому в такой среде возможно, что Стивен Борн не знал об оболочке Джой и, конечно, Джой не знал о Борне. Вполне возможно, что две оболочки впервые встретились, когда UCB получил VAX и предварительный выпуск забытого Unix / 32V . Я помню, как Билл жаловался на распределение памяти. Обратите внимание, что обе оболочки были обратно совместимы с оболочкой V6они просто расширили синтаксис в разных направлениях.
  4. Теперь действительно было несколько несовместимых оболочек, к которым AT & T добавила Bourne-совместимые ksh. В конце концов, у cshнего был полу-доступный исходный код, но он был связан в судебном процессе между AT & T и Калифорнийским университетом . Тем не менее, это были славные дни BSD Unix, поскольку сложные компании, которые могли позволить себе плату в 50 000 долларов, купили бы лицензию AT & T, но установили дистрибутивы BSD 4.x, и университеты получили ее бесплатно.
  5. В этой ситуации со многими юридическими и техническими вопросами были предприняты различные независимые реализации. С cshсинтаксисом по крайней мере многие согласились с синтаксисом оболочки Bourne, а некоторые объединили их. Вы, по крайней мере tcsh, zsh, bashи ash. Синтаксис Bourne был «официальным», будучи частью релизов AT & T, но в те дни BSD был очень важен, и Sun, изначально BSD, распространяла изрядное количество Unix SW, с которым столкнулся мир.
  6. Частично из-за иска USL у FSF и Linux было открытое поле. Тем временем AT & T удалось начать борьбу с одним из немногих юридических лиц на земле, который был больше, чем они (штат Калифорния), и в конце концов они не выиграли иск, и в итоге распределение BSD стало законным. подбетонка. Но к тому времени Linux и bash были повсюду, и сегодня BSD - это ниша.
  7. Наконец, bash - это хорошая оболочка (хотя, по всей видимости, она отрицалась в частном порядке ее первоначальным автором) и полностью заслуживает похвалы за свой собственный успех. csh затмил бы csh и zsh, даже если ash, bash и ksh не выиграли синтаксическую войну.
DigitalRoss
источник
Кроме того, / bin / sh должен быть статически связан.
Если что-то /binи /sbinзависит от /usrэтого, это сломано и должно быть исправлено; они должны зависеть только от библиотек в /lib. loginНужен только PAM; «более новый API», который требует динамических библиотек, будет NSS. «Тенденция к»? NetBSD 2.0 уже перешел на полностью динамичный /binи /sbin5 лет назад, FreeBSD 5.2 еще дольше, и Linux ... ну, это зависит от дистрибутива, но это тоже было давно.
Эфимент
2
Я хочу пояснить, что мой ответ - моя оригинальная работа; нигде не было скопировано ни одного слова .
Норман Рэмси
1
Конечно, я не имел в виду, что вы вставили это, просто что вокруг много дезинформации, и я не хотел ругать вас за то, что вы рассказали уже неправильно понятую историю.
DigitalRoss,
6

Чтобы добавить к тому, что @DigitalRoss сказал

  • Bash - полная замена надмножества для posix-sh, даже в том случае, если он вызывается как / bin / sh, он будет полностью эмулировать posix-sh. Posix-sh был «стандартом» для коммерческих систем unix как оболочка с общим знаменателем. Итак, что-то, что начинается там и опирается на это, начинается с очень многого.
РОП
источник
4

Потому что Linux - это просто ядро ​​(и необходимая поддержка), в то время как GNU предоставляет (или предоставлял) все основные программные клоны Unix, которые делают то, что мы называем «Linux», пригодным для использования. Bash - это оболочка проекта GNU, написанная как клон старой оболочки Bourne (sh) из Unix версии 7.

Beggs
источник
он не спрашивает «почему существует программа оболочки»
hasen
@hasen j: Вопрос задается, если есть историческая причина, по которой все системы Linux, которые он использовал, по умолчанию используют Bash в качестве оболочки.
просит
2
@hasen j: beggs не отвечает "почему существует программа-оболочка". Вы упустили смысл ответа, как, очевидно, и все остальные ТАК.
1

Согласно опросу 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%

HayekSplosives
источник
0

Bash широко известен благодаря своему богатому набору функций. Он также принимает функции от других оболочек, таких как C-shell и Korn-shell. Пожалуйста, взгляните на эти функции.


источник
0

Потому что 'bash' совместим на 100% 'sh / ksh', а 'ksh' - это оболочка POSIX.

Так что если вам нужна POSIX-совместимая система и вы работаете в Linux, тогда вы используете bash.

Если вы работаете в коммерческом Unix, вы обычно получаете ksh в качестве оболочки по умолчанию (иногда просто старый sh). По какой-то причине Sun по-прежнему использует flakey csh c-shell.

Преимущество заключается в переносимости. .Sh, написанный для hp-ux или AIX, имеет хорошие шансы работать в качестве linux 'bash' без каких-либо изменений.


источник
kshэто не оболочка POSIX . Нет такой вещи, как оболочка POSIX . Существуют оболочки, соответствующие спецификации POSIX, которая kshявляется одной из, но ни в коем случае не единственной.
0

И добавить ко всем остальным ответам: zshне подразумевается быть обратно совместимым. Вы, вероятно, можете настроить его так, чтобы он был совместимым, но тогда вы теряете его возможности.

Я использую в zshкачестве своей обычной интерактивной оболочки, но bash/ dashмне кажется более разумным, как языки сценариев оболочки; они делают меньше магии и более предсказуемы ... это более важно для меня, когда я пишу сценарий, который должен работать в течение нескольких лет.

liori
источник
0

Просто чтобы запутать вопросы, shкоманда иногда является просто символической ссылкой на другую программу оболочки, такую ​​как ash, bashили dash.

Ubuntu использовал для связи с ним bash, так bashкак он предназначен для запуска любого совместимого скрипта Bourne.

Однако в последнее время Ubuntu перешел на shссылку dash. dashпредназначен для запуска bashсценариев (и, следовательно, также shсценариев), но он предназначен для использования только для сценариев, поэтому в нем отсутствуют интерактивные функции bash. Это делает его меньше и (возможно) быстрее.

Билл
источник