Bash используется по умолчанию в каждом дистрибутиве Linux, который я пробовал, по сравнению с альтернативами, такими как Z shell (zsh). Есть ли техническая или историческая причина для этого?
Bash используется по умолчанию в каждом дистрибутиве Linux, который я пробовал, по сравнению с альтернативами, такими как Z shell (zsh). Есть ли техническая или историческая причина для этого?
Ответы:
История (приобретенная не благодаря исследованиям, а проведя слишком много времени, проводя время с людьми из Bell Labs):
В начале (если вы считаете начало Unix версии 7) была оболочка Bourne. Стив Борн был первым, кто показал, что оболочка, которая контролирует взаимодействие с пользователем, может быть пользовательской программой, а не особой частью операционной системы. Исторический прорыв. Сама оболочка была относительно чистой для написания сценариев, но не имела редактирования в командной строке или управления заданиями. Введение Борна в Unix Shell все еще полезно для начинающих пользователей сегодня.
Изменить : я проигнорировал некоторые "предыстории" от Кена Томпсона и Джона Маши, также из Multics. Я уверен, что Борн знал обо всей этой работе (он был в той же лаборатории, 1127, в Bell Labs), но оболочка Борна была окончательной, и более ранняя работа имела небольшое влияние, за исключением интерпретации Стива Борна. Например, хотя Кен позже написал компилятор Plan 9 C и оказал большое влияние на Plan 9, но в статье Тома Даффа об оболочке Plan 9 упоминается только оболочка Борна, а не Томпсона.
Оболочка - это просто пользовательская программа, так что любой может написать ее. Когда версия 7 Unix создавалась в Нью-Джерси, Berkeley Unix создавалась в Калифорнии. Билл Джой в Беркли написал csh
, C shell. Джой добавил управление заданиями и историю, а затем редактирование в командной строке, но не знал о работе Борна и поэтому основывал свой язык на оболочке Томпсона (которую я считал «доисторической» в предыдущей статье). Сообщество Unix любило контроль работы, но им также нравился язык Борна. Для не особенно хорошей полемики против языка csh, см. Программирование на Csh считается опасным . Некоторое время многие люди использовали csh
интерактивно для функций управления заданиями и истории, но использовали Борна sh
для написания сценариев. Эта ситуация была не идеальной.
Редактировать : Спасибо DigitalRoss за то, что выправили меня в хронологии csh
. Так как я получил образование от людей, которые называют BSD «ересью Беркли», у меня было мало фактов там.
Дейв Корн из Bell Labs сделал блестящую реинжиниринг оболочки Борна, чтобы произвести оболочку Корна (ksh). Он был полностью обратно совместим с оболочкой Bourne, sh
но обеспечил множество бесценных улучшений. ksh
стал основой стандарта POSIX и был поставлен стандарт с программным обеспечением Sun. (И это несмотря на то, что Билл Джой покинул Беркли, чтобы помочь основать Sun, и был одним из их ведущих разработчиков программного обеспечения.)
Bell Labs и AT & T тупо не могут сделать ksh
open source. 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
скриптов.
Реальная история снаряда
ОБНОВЛЕНИЕ: Существует неточная история копирования оболочки с места на место в сети, и люди по понятным причинам верят в это. Я постараюсь дать точную версию и предоставить несколько ссылок, чтобы подтвердить это здесь.
<, >, >>, |, &
но у него был простой goto
синтаксис управления через внешнюю программу, которая искала стандартный ввод. Тогда не было сложных сценариев оболочки. Более поздние оболочки открывали ввод команды на отдельном fd. Сегодня это может показаться простым, но в фильме ужасов 1970-х годов это была лучшая вещь на земле. Хотите верьте, хотите нет, но эта древняя оболочка имеет свой собственный твиттер-поток сегодня и, конечно же, домашнюю страницу .csh
, написана (как это было vi
) от Билл Джой в UCB. Это было до GNU readline и NetBSD editline, поэтому, казалось, было вполне разумно делать историю с !
синтаксисом. Csh добавил большинство современных функций оболочки, но с синтаксисом csh. csh не менял синтаксис , безвозмездно или иным образом. Он был обратно совместим с оболочкой Томпсона и изначально содержал исходный код TS.osh
и csh
оставалось популярным в течение некоторого времени , Интернета не было, и он имел лицензию SW, поэтому в такой среде возможно, что Стивен Борн не знал об оболочке Джой и, конечно, Джой не знал о Борне. Вполне возможно, что две оболочки впервые встретились, когда UCB получил VAX и предварительный выпуск забытого Unix / 32V . Я помню, как Билл жаловался на распределение памяти. Обратите внимание, что обе оболочки были обратно совместимы с оболочкой V6они просто расширили синтаксис в разных направлениях. 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, с которым столкнулся мир./bin
и /sbin
зависит от /usr
этого, это сломано и должно быть исправлено; они должны зависеть только от библиотек в /lib
. login
Нужен только PAM; «более новый API», который требует динамических библиотек, будет NSS. «Тенденция к»? NetBSD 2.0 уже перешел на полностью динамичный /bin
и /sbin
5 лет назад, FreeBSD 5.2 еще дольше, и Linux ... ну, это зависит от дистрибутива, но это тоже было давно.
Чтобы добавить к тому, что @DigitalRoss сказал
Потому что 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 c-shell.
Преимущество заключается в переносимости. .Sh, написанный для hp-ux или AIX, имеет хорошие шансы работать в качестве linux 'bash' без каких-либо изменений.
И добавить ко всем остальным ответам: zsh
не подразумевается быть обратно совместимым. Вы, вероятно, можете настроить его так, чтобы он был совместимым, но тогда вы теряете его возможности.
Я использую в zsh
качестве своей обычной интерактивной оболочки, но bash
/ dash
мне кажется более разумным, как языки сценариев оболочки; они делают меньше магии и более предсказуемы ... это более важно для меня, когда я пишу сценарий, который должен работать в течение нескольких лет.
Просто чтобы запутать вопросы, sh
команда иногда является просто символической ссылкой на другую программу оболочки, такую как ash
, bash
или dash
.
Ubuntu использовал для связи с ним bash
, так bash
как он предназначен для запуска любого совместимого скрипта Bourne.
Однако в последнее время Ubuntu перешел на sh
ссылку dash
. dash
предназначен для запуска bash
сценариев (и, следовательно, также sh
сценариев), но он предназначен для использования только для сценариев, поэтому в нем отсутствуют интерактивные функции bash
. Это делает его меньше и (возможно) быстрее.