Чому Bash скрізь (у більшості, якщо не у всіх дистрибутивах Linux)?


50

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


1
Це не. У моїй системі FreeBSD tcsh - оболонка за замовчуванням!

54
Ваша система FreeBSD не є дистрибутивом Linux.

8
Не дай Бог, що між дистрибутивом є якась узгодженість ...
OMG Ponies

4
Ні, але це належить до "скрізь" :)

Відповіді:


106

Історія (здобута не за допомогою досліджень, а завдяки витраченню зовсім небагато часу на спілкування з людьми Bell Labs):

  1. На початку (якщо вважати початком версією Unix 7) була оболонка Bourne. Стів Борн першим показав, що оболонка, яка контролювала взаємодію користувача, може бути програмою користувача, а не особливою частиною операційної системи. Історичний прорив. Сама оболонка була відносно чистою для сценаріїв, але не мала редагування командного рядка або контролю за роботою. Введення Борна в оболонку Unix все ще корисно для початківців користувачів сьогодні.

    Редагувати : Я проігнорував деякі "доісторії" від Кена Томпсона та Джона Маші, також з "Мультікс". Я впевнений, що Борн знав про всю цю роботу (він був у тій же лабораторії, 1127, в лабораторії Bell), але оболонка Борна була остаточною, і на попередню роботу мало вплив, окрім інтерпретації Стіва Борна. Наприклад, хоча Кен пізніше написав компілятор Plan 9 C і був дуже впливовим на План 9, але в роботі Тома Даффа про оболонці Plan 9 (rc) згадується тільки оболонка Борна, а не Томпсон.

  2. Оболонка - це лише програма користувача, тому її може написати будь-хто. Оскільки версія 7 Unix створювалася в Нью-Джерсі, Берклі Unix створювався в Каліфорнії. Білл Джой в Берклі написав csh, C оболонку. Джой додав контроль над роботою та історією, а згодом і редагуванням командного рядка, але не знав про роботу Борна і тому ґрунтував свою мову на оболонці Томпсона (яку я вважав "доісторичною" у попередній кулі). Громада Unix любила контроль за роботою, але вони також полюбили мову Борна. Для не особливо гарної полеміки щодо мови csh, див. Програмування Csh, що вважається шкідливою . Протягом певного часу багато людей використовували cshінтерактивно для функцій контролю роботи та історії, але використовували Борна shдля написання сценаріїв. Ця ситуація була менш ідеальною.

    Редагувати : Завдяки DigitalRoss випрямив мене з хронології csh. Оскільки я здобув освіту у людей, які називають BSD "єресі Берклі", мені там було дуже мало фактів.

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

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

    Редагувати : Це було насправді так нерозумно? Важко пізнати. Берклі вже віддав Unix, і незабаром пішли інші корпорації, але це все-таки була епоха, коли корпоративні майстри вірили в плату за Unix. Але результати: AT&T Unix мертвий, після того, як неодноразово продавався різним сторонам. BSD та його похідні живі і здорові, але ці випереджаючі речі, які називаються "Linux" та "GNU", мають величезну частку розуму, яка колись належала Bell Labs.

  5. Фонд вільного програмного забезпечення робить "чисту кімнату", починаючи з нуля впровадження оболонки POSIX, приймаючи всі ідеї Дейва Корна як тодішні, а також у звичайному стилі FSF додаючи нові власні функції, такі як програмоване завершення. Вони називають це оболонкою "Борн знову", або bash.

  6. У середині 1990-х років відкриті джерела AT&T ksh93, але до цього часу вже пізно для широкого застосування. Договір ліцензування дивно нестандартний. bashі kshрозходяться, і kshніколи не досягають ринкової частки, пропорційної її місце в історії.

Уроки:

  • Перший адекватний продукт, який виходить на ринок (sh).

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

  • Редагувати : професори техніки повинні залишати історію історикам науки :-)


Я думаю, у вас справді є найповніше і точне пояснення популярності баш-шоу над усім іншим. Я бачив середовища, які за замовчуванням zsh, і я ненавиджу їх, тому що весь синтаксис трохи відключений, і я не можу це зрозуміти або я роблю помилки.

Куля (1) потребує виправлення: раніше оболонка Борна була оболонкою Маші, а до того, як оболонка Маші була ур-Шелл, снаряд Кен Томпсон. Дивіться en.wikipedia.org/wiki/Unix_shell
Джим Ферранс

2
Не звинувачуючи конкретно Нормана, тут є багато неточностей. Кен Томпсон написав першу оболонку, яка була єдиною оболонкою через V6 і паралельно використовувалася у V7 та 32V. Стівен Борн не був "першим" автором оболонок, він переписав оболонку KT. Csh не мав управління роботою до 4.1BSD, хоча це була перша оболонка, яка отримала його. Csh не змінив жодного синтаксису оболонки, він був сумісний з оболонкою V6, як і оболонка Bourne. Майже весь код був ліцензований в ті часи. Що саме було дурним щодо стягнення ліцензійних платежів для Unix?
DigitalRoss

2
Я, мабуть, не дуже добре це пояснюю, дозвольте спробувати ще раз. Csh передував Борну , або пізніше було паралельним впровадженням континенту. (До Інтернету це мало значення.) Я сидів поруч із Біллом Джоєм у Коррі Холі, періодично, коли він писав це; Можу абсолютно запевнити, що він написав це на V6. Як я вже говорив, csh (і Bourne) сумісні з V6-Thompson-назад, як це все, що існувало, коли вони їх писали. Звичайно, це не сумісно з Борном, таланти AFAIK Білла
Джоя

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. Перша оболонка, безумовно, не була оболонкою Борна, але була написана самим Кеном Томпсоном та розповсюджена у V6, що є версією AT&T, що надсилається до різних університетів та урядових лабораторій. Саме це поставило Unix на карту. Він мав усі основи, <, >, >>, |, &але він просто мав простий gotoсинтаксис управління через зовнішню програму, яка шукала на стандартному вході. Тоді не було складних сценаріїв оболонок. Пізніше оболонки відкриють командний вхід на окремому fd. Сьогодні це може виглядати просто, але у фільмі жахів, що було вичислено в 1970-х, це було найкраще на землі. Вірите чи ні, ця давня оболонка має свій власний потік щебет сьогодні і, звичайно, домашню сторінку .
  2. Друга оболонка була csh, написана (як це було vi) від Білл Джой в UCB. Це було раніше, ніж читати лінійку GNU та редагувати NetBSD, тому, мабуть, здавалося, цілком розумно робити історію із !синтаксисом. Csh додав більшість функцій оболонки сьогодні, але з синтаксисом csh. csh не змінив жодного синтаксису , безоплатно або іншим чином. Насправді він був сумісний із оболонкою Томпсона та спочатку включав вихідний код TS.
  3. Третя оболонка була оболонкою Борна, з різним синтаксисом. Unix розроблявся паралельно на UCB та AT&T. Ця оболонка мала дивний аллокатор пам'яті (я думаю , що він просто використовував більше пам'яті, захоплений SIGSEGV, зробив новий BRK (2), а потім спробував ще раз) , що ускладнювало працювати на нових порти Unix, так oshі cshзалишився популярним в протягом деякого часу . Інтернету не було, і він отримав ліцензію SW, тому в цьому середовищі можливо, що Стівен Борн не знав про оболонку Джоя і, звичайно, Джой не знав про Борна. Цілком можливо, що обидва снаряди вперше зустрілися, коли UCB отримав VAX і попереднє випуск вже забутого Unix / 32V . Я пам'ятаю, як Білл скаржився на розподіл пам'яті. Зауважте, що обидві оболонки були сумісні з зворотом до оболонки V6, вони просто розширили синтаксис у різних напрямках.
  4. Тепер дійсно було декілька несумісних оболонок, до яких AT&T додав сумісність з Борном ksh. Врешті-решт, він cshмав напівдоступний вихідний код, але він був пов'язаний у позові між AT&T та Каліфорнійським університетом . І все-таки це були дні слави BSD Unix, оскільки складні компанії, які могли дозволити собі плату в розмірі 50 000 доларів, купували б ліцензію AT&T, але встановлювали дистрибутив 4.x BSD, і університети отримували його безкоштовно.
  5. У цій ситуації з багатьма юридичними та технічними питаннями було здійснено різні незалежні впровадження. Принаймні стільки ж пішло з cshсинтаксисом, скільки й з синтаксисом оболонки Борна, а деякі злили два. Ви, по крайней мере tcsh, zsh, bashі ash. Синтаксис Bourne був "офіційним", він був частиною випусків AT&T, але в ті часи BSD був досить важливим, і Sun, спочатку BSD, поширював неабияку кількість SW з Unix, з якою стикався світ.
  6. Частково через позов USL, FSF та Linux мали відкрите поле. Тим часом AT&T зуміла вступити в бій з одним з небагатьох суттів на землі, більшим, ніж вони були (штат Каліфорнія), і врешті вони не виграли позов, і, врешті-решт, розповсюдження BSD було суворо законним опори. Але на той час Linux і bash були скрізь, і сьогодні BSD - це ніша.
  7. Нарешті, баш - це добра оболонка (хоча, очевидно, відмовилася від приватного оригінального автора), і цілком заслуговує на заслугу за власний успіх. csh було б затьмарене tcsh і zsh, навіть якби ash, bash і ksh не перемогли у синтаксичній війні.

Також / bin / sh має бути статично пов'язаним.

Якщо щось є /binі /sbinзалежить від /usrцього, це порушено і його потрібно виправити; вони повинні залежати лише від бібліотек у Росії /lib. loginПотрібна лише PAM; "новіший API", який потребує динамічних лібсів, буде NSS. "Тенденція до"? NetBSD 2.0 вже перейшов на повністю динамічний /binі /sbin5 років тому, FreeBSD 5.2 ще довше, а Linux ... ну, це залежить від distro, але це теж давно.
ефемієнт

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.


він не запитує "чому існує програма з оболонками"
hasen

@hasen j: Питання задається, чи є історична причина, чому всі системи Linux він використовував за замовчуванням Bash як оболонку.
благає

2
@hasen j: beggs не відповідає "чому існує програма оболонки". Ви пропустили точку відповіді, як очевидно, і всі інші SO-ривок коліна.

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%


0

Баш широко прийнятий завдяки своєму багатому набору функцій. Він також використовує функції інших оболонок, таких як C-shell і Korn-shell. Погляньте на ці функції.


0

Тому що 'bash' є 100% 'sh / ksh' порівнянним, а 'ksh' оболонкою POSIX.

Тож якщо ви хочете, що відповідає сумісності з POSIX, і ви перебуваєте в Linux, тоді ви використовуєте bash.

Якщо ви перебуваєте в комерційному unix, ви зазвичай отримуєте ksh як оболонку за замовчуванням (колись звичайний просто старий sh). Чомусь Sun все ще за замовчуванням не має пластівців csh c-shell.

Перевагою є портативність .sh, написаного для hp-ux або AIX, має великі шанси працювати як linux 'bash' без будь-яких змін.


kshне є оболонкою POSIX . Немає такого поняття, як оболонка POSIX . Є оболонки, які відповідають специфікації POSIX, яка kshє однією, але далеко не єдиною.

0

І додати до всіх інших відповідей: zshне означає бути сумісними назад. Ви, ймовірно, можете налаштувати його так, щоб він був сумісним, але тоді ви втрачаєте його функції.

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


0

Для того, щоб заплутати питання, shкоманда іноді є лише символічним посиланням на іншу програму оболонки, наприклад ash, bashабо dash.

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

Однак останнім часом Ubuntu перейшов на shпосилання на dash. dashпризначений для запуску bashсценаріїв (а отже, і shсценаріїв), але він призначений для використання лише для сценаріїв, тому йому не вистачає інтерактивних функцій bash. Це робить його меншим і (можливо) швидшим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.