Який сенс пов’язаний з штрихом?


36

Мені цікаво, в чому сенс shбути символічним dash? Я розумію, що dashце має бути швидше bash, але я не впевнений, чому в оригінальній shоболонці немає sh.

Або якщо щось, чому це не shпов'язано bash?

Відповіді:


72

Коротка відповідь на "чому оригінальної оболонки sh немає в sh" полягає в тому, що немає оригінальної sh.

Ну добре, є: це оболонка Томпсона . Версія 1 мала деякі особливості, про які ми знаємо сьогодні, зокрема перенаправлення та передачу даних (читайте статтю Деніса Річі про ранню історію Unix ). Пізніші версії додали такі функції, як фонове виконання &, глобалізація (реалізована із зовнішньою програмою) та деякі форми цитування, але вони не мали змінних чи вкладених структур управління. Умови та цикли забезпечувалися за допомогою зовнішніх програм if(які брали за умови аргумент одну умову та одну команду) та goto(які працювали, змінюючи положення файлу свого батька у файлі сценарію).

У 1979 році в Unix V7 оболонку Томпсона було замінено, як /bin/shна оболонку Борна . Перший випуск вже мав багато функцій , які сьогодні присутні в тирі, а наступні версії представили ще багато інших . Через кілька років на сцену вийшов панцир Korn , де зростаючий набір функцій; багато варіантів Unix встановили його під назвою ksh.

У 1992 році POSIX кодифікував мінімальний набір shфункцій, який був в основному Борном плюс кілька речей. Будь-яка система, яка називала себе "Unix", повинна була реалізувати принаймні ці функції. Комерційні системи Unix зазвичай використовували ksh як POSIX sh, але деякі (наприклад, OSF / 1 ) мали свої власні.

Ні оболонка Борна, ні оболонка Корна до недавнього часу не були відкритим кодом, тому коли в середині 1990-х почав формуватися світ Linux, вони були недоступними. /bin/shповинно було бути щось інше. Більшість дистрибутивів Linux припадало на bash , оболонку проекту GNU, який, як правило, був між Борном і Корном за сценарієм, і набагато краще, ніж будь-яке інтерактивне використання). Єдиною життєздатною альтернативою був pdksh ("оболонка Korn для загальнодоступного домену"), вільний (зараз припинено, але він живе як mksh , який активно розробляється ), але я не пам'ятаю дистрибутива Linux, використовуючи pdksh як/bin/sh, Я не знаю, чому, напевно, тому що дистрибутиви Linux завжди були дистрибутивами GNU / Linux, і в основному вони постачають версії GNU будь-якого інструменту, для якого існувала версія GNU.

Було також декілька реалізацій з відкритим кодом під shназвою "зола", зокрема, оболонки Almquist , але вони були дуже неповними, не мали деяких функцій POSIX, якими люди хотіли користуватися. Програміст, який був обслуговувачем Debian, Герберт Сю , розширив золу, щоб зробити її сумісною з POSIX. Врешті-решт його версія була перейменована на тире, і було певне поштовх зробити це /bin/shв Debian замість bash. Ubuntu розпочався ще до того, як Debian почав систематично ставитись до башизмів (використання специфічних для bash функцій у #!/bin/shскриптах) як помилок . Обидва перейшли пізніше ( Ubuntu 6.10 , Debian лише у 2009 році ( це було метою для lenny але перемикач був зроблений лише після вивільнення закваски, тобто в стисканні)).

Основна причина використання тиру в якості , а не Баша в /bin/shтому , що це значно швидше. Особливо це було важливо для Ubuntu, який з самого початку прагнув дотримуватися короткого часу завантаження. Dash також має тенденцію використовувати менше пам'яті, ніж bash, що дещо важливо для скриптів обгортки, які залишаються навколо, щоб зробити трохи очищення, коли основна програма закінчується. Ще одна перевага тире полягає в тому, що він покладається лише на libc (основну системну бібліотеку), тоді як bash також покладається на бібліотеки підтримки терміналів (він не може запускатися без них, навіть для запуску сценарію); це означає, що тире має більше шансів продовжувати працювати над зламаною системою.

В якийсь момент протягом 21 століття оболонка Корна вийшла з відкритим кодом, і з'явилися відкриті версії оболонки Борна (старі версії, оскільки розвиток припинився роками раніше). Але тире і баш були занадто міцно закріпилися в світі Linux, щоб вони отримали будь-яке визнання, особливо оболонку Борна, оскільки його значення сьогодні є лише історичним. Dash витіснив баш, тому що мав явні переваги, але жоден з інших претендентів не має жодної вирішальної переваги /bin/sh.


Я можу стверджувати, що є вагомі причини використовувати ksh93 як / bin / sh - це одна з найбільш високопродуктивних POSIX-оболонок. Погодилися, що повсюдність тире - це питання часу.
Чарльз Даффі

2
@CharlesDuffy Ksh93 швидше виконує складні речі, але тире перемагає його під час запуску, а також для простих скриптів (таких як усі виклики system(3), які роблять програми), це домінуючий фактор.
Жил 'SO- перестань бути злим'

21

Швидкість та відповідність POSIX (іншими словами, портативність) - основні фактори. Пам’ятайте, що /bin/shпризначено для системних скриптів, які можуть бути, а можуть і не надходити із старих версій Ubuntu та / або інших систем.

Звичайно, блискучі особливості bashкласно використовувати для нас користувачів, але коли справа доходить до запущеної речі в середовищі, де вам доведеться керувати декількома різними серверами / системами, - наявність оболонців, сумісних з POSIX, робить велику різницю. Особливо, якщо ви новий системний адміністратор і успадковане середовище з багатьма сценаріями.

Щодо того, чому оригінальної оболонки Борна немає, це просто - це фірмовий продукт, спочатку належить AT&T Bell Labs.

Також насправді є чітке пояснення у вікі Ubuntu щодо цього:

Чому була внесена така зміна? Основною причиною переключення оболонки за замовчуванням була ефективність. bash - відмінна повнофункціональна оболонка, що підходить для інтерактивного використання; Дійсно, це все ще оболонка для входу за замовчуванням. Однак він досить великий і повільний, щоб запустити та працювати в порівнянні з тире. Велика кількість екземплярів оболонок запускається як частина завантажувального процесу Ubuntu. Замість того, щоб змінити кожного з них окремо, щоб явно запускатись під / bin / dash, зміна, яка потребує значного постійного технічного обслуговування, і яка може піддаватися регресу, якщо не звертати пильної уваги, команда розробників Ubuntu вважала, що найкраще просто змінити оболонка за замовчуванням. Поліпшення швидкості завантаження в Ubuntu 6.10 часто неправильно приписували Upstart, що є прекрасною платформою для подальшого розвитку системи init, але в Ubuntu 6. 10 в основному працював у режимі сумісності System V із невеликими поведінковими змінами. Насправді ці поліпшення були значною мірою зумовлені зміною / бін / ш.

І ось примітка про портативність:

Посібник з політики Debian давно передбачає, що "скрипти оболонки, що вказують '/ bin / sh' як інтерпретатор, повинні використовувати лише POSIX функції"; насправді ця вимога існує ще задовго до створення проекту Ubuntu. Крім того, будь-які сценарії оболонки, які, як очікується, переноситимуться в інші системи Unix, такі як BSD або Solaris, вже виконали цю вимогу. Таким чином, ми вважали, що вплив цих змін на сумісність буде мінімальним.

Дивіться https://wiki.ubuntu.com/DashAsBinSh


Не dashпідтримує функції, які не потрібні POSIX?
NerdOfLinux

@NerdOfLinux Це неважливо, що / bin / sh підтримує крім POSIX (до тих пір, поки ці доповнення не порушують сценарії POSIX); найважливіше - він підтримує все POSIX (і проходить максимально швидко). Поки тире виконує ці вимоги, / bin / sh може посилатися на нього.
Гунтрам Блом підтримує Моніку

9

У дистрибутивах GNU / Linux "оригінал /bin/sh" - це фактично Bash.

GNU хотів оболонки, подібної до Борна, яка була під GPL, тому вони обрали Bash для свого /bin/shзамість Bourne, який не мав ліцензії GPL. Сучасні дистрибутиви Linux успадкували це рішення до того, що воно стало стандартом дефакто для того, /bin/shщоб бути Bash. Оригінальна оболонка Bourne ("sh") використовувалася в інших нелінуксних Unixes, ще зовсім недавно Solaris 10, але вона ніколи не була основою в дистрибутивах Linux.

Перехід /bin/shвід bash на тире було рішенням Debian (успадкованим Ubuntu), в основному мотивованим швидкістю - це прийшло в той момент, коли вони доклали величезних зусиль для покращення швидкості завантаження, і значна частина часу завантажувального процесора в той час, який відповідав роботі скрипти init.

Bash продовжує використовуватися як інтерактивна оболонка для входу / входу для користувачів, але Dash - це /bin/shта та, яка виконується для системних скриптів, таких як init script.

Dash дуже швидкий, але також дуже тісний POSIX-сумісний - стандарт, який тісно узгоджується з оболонкою Bourne. Таким чином, переходячи з Bash на Dash, ми переходимо назад до оболонки, більш тісно поєднаної з Борном.


"Dash дуже швидкий, але також дуже тісний POSIX-сумісний - стандарт, який тісно узгоджується з оболонкою Bourne". Так, хоча kshя б сказав , що POSIX більш тісно пов'язаний . Я не пригадую оболонку Бурна, яка має арифметичне розширення `$ (())`, що є POSIX.
Сергій Колодяжний

1
Також у Bourne ^- це трубопровідний персонаж - так echo foo ^ catбуде випромінюватися foo ^ catв POSIX sh, але fooв Bourne; цей специфічний тест - це те, як Autoconf розказує два.
Чарльз Даффі

Цікаво, значить під POSIX ш ви маєте на увазі Корн?
thomasrutter

0

/bin/shпов'язаний з /bin/dashтим, що, на мою думку, є причинами сумісності. Багато сценаріїв просто починаються з

#!/bin/sh

тому, переходячи на dashсимволічне посилання та не роблячи його, багато сценаріїв не зможуть запуститися належним чином (або взагалі), якби їх /bin/shвзагалі не було.

Зміни були внесені bashдо, dashтому що згідно https://wiki.ubuntu.com/DashAsBinSh :

Основною причиною переключення оболонки за замовчуванням була ефективність. bash - відмінна повнофункціональна оболонка, яка підходить для інтерактивного використання; Дійсно, це як і раніше оболонка для входу за замовчуванням. Однак він досить великий і повільний, щоб запустити та працювати в порівнянні з тире. Велика кількість екземплярів оболонок запускається як частина завантажувального процесу Ubuntu. Замість того, щоб змінити кожного з них окремо, щоб явно запускатись під / bin / dash, зміна, яка потребує значного постійного технічного обслуговування, і яка може піддаватися регресу, якщо не звертати пильної уваги, команда розробників Ubuntu вважала, що найкраще просто змінити оболонка за замовчуванням.

shне пов’язаний bash, тому що

Посібник з політики Debian давно наказує, що "скрипти оболонки із зазначенням '/ bin / sh' як інтерпретатора повинні використовувати лише POSIX функції"

Якщо ви хочете використовувати bashяк /bin/sh:

Якщо проблеми є більш поширеними, і ви хочете змінити системну оболонку за замовчуванням назад, тоді ви можете доручити системі управління пакетом припинити встановлення тире як / bin / sh:

sudo dpkg-reconfigure dash

Є деякі функції, які dashпередбачають, що bash не виконує, як:

є навіть зовнішній шанс, що є кілька сценаріїв, які тепер залежать від певної функції тире, яку баш не надає!


Я вже зрозумів, що сумісність може бути фактором, але я шукав не настільки очевидну і більш глибоку відповідь ...
NerdOfCode

2
Так що, якщо б я повинен був встановити оригінальний Bourne Shell shдо /bin/sh, буде цей гвинт до тих завантажувальних скриптів?
десерт

Напевно, найкраще спробувати це у віртуальній машині спочатку перед розгортанням у реальному світі ...
NerdOfCode

2
Ви повинні залишити /bin/shоболонку, надану дистрибутивом, оскільки саме на це вони націлені зі своїми сценаріями завантаження тощо. Але якби ви замінили його на Борна, це було б переважно сумісним. Я б міг уявити, що трапляються поломки, лише через мінусові відмінності від великої кількості коду. Звичайно, ви можете безкоштовно використовувати будь-яку оболонку у власних сценаріях із користувацьким хешбангом.
thomasrutter

1
@mckenzm До якого оболонки /bin/shпосилається окремо, від якого один конкретний користувач встановив свою початкову оболонку входу. Мета /bin/shне залежить від того, який користувач дивиться, і ви робите необхідність використання sudo-OR , інші кошти діяти в якості кореневого користувача - змінити його. Також, загалом і для будь-якого пакета, dpkg-reconfigureслід запускати як root. На відміну від цього, користувачам зазвичай дозволено змінювати власну початкову оболонку входу і може це робити за допомогою chshкоманди. Ім'я початкової оболонки для входу також входить $SHELLі використовується і для деяких інтерактивних оболонок, які не входять у систему.
Елія Каган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.