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

Вопрос или проблема

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

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

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

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

  2. Оболочка является просто пользовательской программой, так что любой может написать свою. В то время как создавался Version 7 Unix в Нью-Джерси, в Калифорнии создавался Berkeley Unix. Билл Джой в Berkeley написал csh, оболочку C. Джой добавил управление работой и историю, а позже редактирование командной строки, но не был в курсе работы Борна и основывал свой язык на оболочке Томпсона (которую я считал “предhistorической” в предыдущем пункте). Сообщество Unix любило управление работой, но они также любили язык Борна. Для неплохой полемики против языка csh см. Csh Programming Considered Harmful. В течение некоторого времени многие люди использовали csh интерактивно из-за его функций управления работой и истории, но использовали оболочку Борна sh для написания сценариев. Эта ситуация была менее чем идеальной.

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

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

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

    Правка: Было ли это на самом деле так глупо? Трудно знать. Berkeley уже раздавал Unix, и другие корпорации вскоре должны были последовать, но это была все еще эпоха, когда Корпоративные Мастера верили в плату за Unix. Но результаты: AT&T Unix мертв, после того как был продан различным сторонам множество раз. BSD и его производные живы и здоровы, но эти новые вещи под названием “Linux” и “GNU” имеют огромную долю мысленного пространства, которая когда-то принадлежала Bell Labs.

  5. Фонд свободного программного обеспечения делает реализацию оболочки POSIX с чистого листа, принимая все идеи Дэйва Корна на тот момент, плюс в обычном стиле FSF добавляет новые собственные функции, такие как программируемое завершение. Они называют это оболочкой “Bourne again” или bash.

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

Уроки:

  • Первый адекватный продукт на рынке побеждает (sh).

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

  • Правка: Профессора инженерии должны оставить историю историкам науки 🙂

Bash имеет две совершенно разные особенности.

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

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

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

Сказание о двух оболочках

Настоящая история оболочки

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

  1. Первая оболочка, безусловно, не была оболочкой Борна, а была написана самим Кеном Томпсоном и распространялась в V6, которая являлась версией, отправленной AT&T в различные университеты и государственные лаборатории. Это и сделало Unix известным. В ней были все основные функции, <, >, >>, |, &, но она просто имела простой синтаксис контроля goto через внешнюю программу, которая искала на стандартном вводе. Тогда не было сложных оболочечных скриптов. Позже оболочки открывали ввод команд на отдельном fd. Сегодня это может показаться простым, но в ужасах 1970-х computing это было лучшим, что существовало на свете. Верите или нет, эта древняя оболочка имеет свой собственный твиттер сегодня и, конечно, домашнюю страницу.
  2. Вторая оболочка была csh, написанная (как vi) Биллом Джоем в UCB. Это было до GNU readline и NetBSD editline, так что, вероятно, казалось вполне разумным делать историю с синтаксисом !. Csh добавила большинство сегодняшних функций оболочки, но с синтаксисом csh. csh не изменила никакой синтаксис, беспричинно или иначе. Она была фактически обратно совместима с оболочкой Томпсона и изначально включала исходный код TS.
  3. Третья оболочка – это оболочка Bourne, с другим синтаксисом. Unix разрабатывался параллельно в UCB и AT&T. Эта оболочка имела странный аллокатор памяти (я думаю, она просто использовала больше памяти, ловила SIGSEGV, делала новый brk(2) и пыталась снова), который затруднял ее запуск на новых портах Unix, так что osh и csh оставались популярными в течение некоторого времени. Тогда не было интернета, и это было лицензируемое программное обеспечение, поэтому в той среде возможно, что Стивен Борн не знал о Sheldon Joy и, определенно, Джой не знал о Борне. Возможно, эти две оболочки впервые встретились, когда UCB получил VAX и предварительную версию ныне забытого Unix/32V. Я помню, как Билл жаловался на распределение памяти. Обратите внимание, что обе оболочки были обратно совместимы с оболочкой V6, они просто расширяли синтаксис в разных направлениях.
  4. Теперь действительно были несколько несовместимых оболочек, к которым AT&T добавила совместимую с Bourne ksh. В конечном итоге, csh имела полугодной источник, но он был связан с иском между AT&T и Калифорнийским университетом. Тем не менее, это были славные дни BSD Unix, так как сложные компании, которые могли позволить себе плату в $50,000, покупали лицензию AT&T, но устанавливали дистрибутивы 4.x BSD, и университеты получали это бесплатно.
  5. В этой ситуации с множеством юридических и технических вопросов проводились различные независимые реализации. По крайней мере столько же шло с синтаксисом csh, как с синтаксисом оболочки Bourne, и некоторые объединяли оба. У вас были как минимум tcsh, zsh, bash и ash. Синтаксис Bourne был “официальным”, поскольку он входил в дистрибутивы AT&T, но в те дни BSD была довольно важной, и Sun, изначально BSD, распределяла значительную долю программного обеспечения Unix, с которым столкнулся мир.
  6. Отчасти из-за иска USL, Фонд свободного программного обеспечения и Linux имели открытое поле. Тем временем, AT&T удалось поссориться с одной из немногих сущностей на земле, которые были больше них (Штат Калифорния), и в конечном итоге они не выиграли иск, и поэтому в конечном итоге дистрибуция BSD была на твердой юридической основе. Но к тому времени Linux и bash были повсюду, и поэтому сегодня BSD является нишевым.
  7. Наконец, bash – хорошая оболочка (хотя, похоже, она была приватно отвергнута ее оригинальным автором) и полностью заслуживает признания за свой успех. csh была бы затмита tcsh и zsh, даже если бы ash, bash и ksh не выиграли синтаксическую войну.

В дополнение к тому, что сказал @DigitalRoss

  • Bash является полным надмножеством замены для posix-sh, даже до того момента, что если его вызвать как /bin/sh, он полностью эмулирует posix-sh. Posix-sh был “стандартом” для коммерческих систем unix как оболочка общего знаменателя. Так что что-то, что начинается оттуда и строится на этом, начинает с большого преимущества.

Поскольку Linux – это только Ядро (и необходимая поддержка), в то время как GNU предоставляет (или предоставлял) все основные программные клоны Unix, которые делают то, что мы называем “Linux”, удобным. Bash – это оболочка проекта GNU, написанная как клон старшей оболочки Борна (sh) из Unix Version 7.

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

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

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

Согласно опросу на 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 до сих пор по умолчанию использует ненадежную csh c-shell.

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

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

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

Ответ или решение

Bash, или Bourne Again SHell, широко используется по умолчанию во всех дистрибутивах Linux. Это можно объяснить несколькими причинами, как технического, так и исторического характера. Давайте детально рассмотрим основные аспекты, объясняющие, почему Bash стал практически универсальным выбором для систем Linux.

Исторический контекст

  1. Появление оболочки: В начале исторического развития Unix, создание оболочки было достаточно революционным шагом. Bourne shell, разработанный Стивом Борном, стал первым решением, которое показало, что оболочка может быть пользовательской программой, а не частью операционной системы. Это стало основой для многих последующих разработок.

  2. Значение Open Source: В середине 1980-х годов, когда Free Software Foundation разработала Bash как открытую альтернативу для POSIX-совместимой оболочки, она охватывала нужды пользователей благодаря совместимости с Bourne shell и внедрению новых возможностей, таких как программируемое дополнение, массивы и другие. Это сделало Bash естественным выбором для многообразия Linux-дистрибутивов.

  3. Замещение других оболочек: Во времена, когда такие оболочки, как Korn Shell (ksh) и C Shell (csh), получили широкое распространение, они не стали настолько гибкими и универсальными, как Bash, который свободно интегрировал функции от других оболочек и предлагал обратную совместимость.

Технические преимущества

  1. Совместимость с POSIX: Bash является полным супермаркетом для написания скриптов, совместимым с POSIX, что делает его универсальным инструментом не только для Linux, но и для других Unix-систем. Это важное преимущество для разработчиков, осуществляющих кроссплатформенные проекты.

  2. Особенности и расширения: Bash включает множество функций, которые улучшают пользовательский опыт, такие как редактирование командной строки, история команд и другие расширенные возможности, что делает его более удобным в использовании.

  3. Широкая поддержка и документация: Важным аспектом распространенности Bash является его популярность и поддержка в сообществе open source, что приводит к обширной документации и множеству ресурсов, доступных для изучения.

Социальные и культурные факторы

  1. Сообщество и экосистема: Благодаря активной поддержке сообщества и инициативам, таким как GNU, Bash стал символом свободного программного обеспечения, что привлекло к нему множество пользователей и разработчиков.

  2. Состояние умолчания: Многие дистрибутивы Linux выбирают Bash в качестве стандартной оболочки по умолчанию, что создает цепную реакцию: внедрение в проекты, обучение, документация и поддержка сообществом.

Заключение

Bash стал стандартом во множестве дистрибутивов Linux не только благодаря своим техническим возможностям, но и под влиянием исторических и социальных факторов. Он представляет собой мощный инструмент для разработчиков, предлагая соответствие стандартам POSIX, расширенные функции и богатую экосистему. Такие качества позволяют Bash оставаться основным шелі в Linux, что делает его незаменимым в мире программирования и системного администрирования.

Таким образом, выбор Bash как стандартной оболочки в большинстве Linux-дистрибутивов обоснован с исторической, технической и социокультурной точки зрения.

Оцените материал
Добавить комментарий

Капча загружается...