Мені цікаво, в чому сенс sh
бути символічним dash
? Я розумію, що dash
це має бути швидше bash
, але я не впевнений, чому в оригінальній sh
оболонці немає sh
.
Або якщо щось, чому це не sh
пов'язано bash
?
Мені цікаво, в чому сенс sh
бути символічним dash
? Я розумію, що dash
це має бути швидше bash
, але я не впевнений, чому в оригінальній sh
оболонці немає sh
.
Або якщо щось, чому це не sh
пов'язано bash
?
Відповіді:
Коротка відповідь на "чому оригінальної оболонки 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
.
system
(3), які роблять програми), це домінуючий фактор.
Швидкість та відповідність 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
?
У дистрибутивах 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, ми переходимо назад до оболонки, більш тісно поєднаної з Борном.
ksh
я б сказав , що POSIX більш тісно пов'язаний . Я не пригадую оболонку Бурна, яка має арифметичне розширення `$ (())`, що є POSIX.
^
- це трубопровідний персонаж - так echo foo ^ cat
буде випромінюватися foo ^ cat
в POSIX sh, але foo
в Bourne; цей специфічний тест - це те, як Autoconf розказує два.
/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 не виконує, як:
є навіть зовнішній шанс, що є кілька сценаріїв, які тепер залежать від певної функції тире, яку баш не надає!
sh
до /bin/sh
, буде цей гвинт до тих завантажувальних скриптів?
/bin/sh
оболонку, надану дистрибутивом, оскільки саме на це вони націлені зі своїми сценаріями завантаження тощо. Але якби ви замінили його на Борна, це було б переважно сумісним. Я б міг уявити, що трапляються поломки, лише через мінусові відмінності від великої кількості коду. Звичайно, ви можете безкоштовно використовувати будь-яку оболонку у власних сценаріях із користувацьким хешбангом.
/bin/sh
посилається окремо, від якого один конкретний користувач встановив свою початкову оболонку входу. Мета /bin/sh
не залежить від того, який користувач дивиться, і ви робите необхідність використання sudo
-OR , інші кошти діяти в якості кореневого користувача - змінити його. Також, загалом і для будь-якого пакета, dpkg-reconfigure
слід запускати як root. На відміну від цього, користувачам зазвичай дозволено змінювати власну початкову оболонку входу і може це робити за допомогою chsh
команди. Ім'я початкової оболонки для входу також входить $SHELL
і використовується і для деяких інтерактивних оболонок, які не входять у систему.