Чому ніхто не використовує справжню оболонку Борна як / bin / sh?


55

Я помітив, що в основному жодна система, з якою я ніколи не працював, не /bin/shє справжньою програмою. Це завжди символічна посилання dash, bashв режимі POSIX, або що - щось подібне.

Чому? Які недоліки використання справжнього, оригінального /bin/sh? (Швидкість? Ліцензування?)


3
Ви тільки коли-небудь використовували Linux, правда? Я тільки коли-небудь бачив "sh як symlink" в Linux.
Грег Х'югілл

@GregHewgill Чи не останні версії Solaris були shслінковани в ksh?
Жил "ТАК - перестань бути злим"

1
@Gilles відповідно до однієї з відповідей, так, оскільки Solaris 11. це пов'язано з ksh.
strugee

1
@GregHewgill Я також використовував Дарвін, який його посилається на bash, IIRC.
strugee

6
Що ви маєте на увазі під оригіналом / bin / sh ? Оболонка Thomson від Unix V1? Оболонка Bourne від Unix V7, яка не мала функцій, не коментує ...? Той у SysIII, SysV, Solaris, HP / UX, повторне реагування золи на BSD? На сьогоднішній день shбазується на стандарті, а це означає, що ми можемо мати декілька реалізацій, які будуть вести себе чітко визначеним способом, поки ви використовуєте стандартний синтаксис у своєму сценарії.
Стефан Шазелас

Відповіді:


38

Я б здогадувався відсутністю функцій - ні історії команд, ні фантазійного перенаправлення, ні редагування командного рядка. З cshцих причин BSD представила оболонку C. Ще один фактор полягає в тому, що справжня шкаралупа Борна була нещодавно доступна у відкритому вигляді . Якщо ви не отримали ліцензію, ви не можете її поширити. Це поставило його недоступним для безкоштовних дистрибутивів і зробило його ідеологічно непридатним для інших дистрибутивів та * BSD.

Але код доступний вже зараз. Ви можете подивитися, скласти його, дати йому крутити.


50
А потім негайно переключіться на те, що ви раніше використовували.
Ігнасіо Васкес-Абрамс

24
@strugee "" відсутність функцій "- чому це буде проблемою?" Так, хороший пункт ... чому програмісти використовують непотрібні речі, такі як мови збирання / C / високого рівня, коли все, що ви можете зробити з ними, ви вже можете писати мова машини безпосередньо? Факт: особливості = збільшення швидкості розвитку + збільшення ремонтопридатності = менші витрати = краще Використання shточно так само, як використання, bashза винятком того, що це: повільніше, програми довші та їх складніше підтримувати.
Бакуріу

10
Насправді це не відсутність функцій, але факт POSIX зобов’язує shкоманду запускати POSIX-сумісну оболонку, що не є застарілою оболонкою Bourne. Хоча POSIX не вимагає shбути в ньому /bin/sh, це найбільш логічний каталог.
jlliagre

4
Історія команд @ Bakuriu та редагування командного рядка - це речі, які вам справді не знадобляться для сценарію.
strugee

4
@strugee Це не єдині відмінності. Для прикладу shне має тильди і дужка розширення, деякі вбудовані модулі не вистачає (наприклад , pushdі popd, select) не арифметична розширення. Немає багато змінних, наприклад PIPESTATUS.
Бакуріу

23

Заява у вашому запитанні невірна. Solaris до версії 10 є забезпечення успадкованої істинної оболонки Bourne як /bin/sh. Це було зроблено, щоб не порушувати сумісність зі старими сценаріями, які можуть вийти з ладу з іншою оболонкою. Інакше цей вибір був дуже розчаровуючий.

Більшість, якщо не всі залишилися випуски Unix та Unix, включаючи Solaris 11, надають оболонку, сумісну з POSIX, /bin/shоскільки POSIX надає shкоманду для запуску оболонки POSIX, а не застарілу оболонку Bourne, яка не сумісна. /bin/shяк правило:

  • ksh88або ksh93про комерційні реалізації Unix
  • змінені bashна OS/X(хоча це було zsh)
  • ashабо pdkshпохідні від одногоBSDs
  • bashабо dashна дистрибутивах Gnu / Linux.

Це не обов'язково посилання, але може бути справжнім виконуваним файлом у багатьох системах, окрім Gnu / Linuxes.

Цікаво, що, незважаючи на те, що зазначено найбільш схвалену відповідь на ваше запитання, це не той факт, що розробники дистрибуторів не призводять до того, щоб встановити щось інше, ніж застаріла оболонка Bourne, /bin/shа бажання бути максимально сумісним з POSIX, тобто вести себе як Unix, як ОС. Той факт, що оболонка POSIX має більше можливостей, ніж застаріла оболонка Bourne, є лише побічним ефектом цієї стандартної мети дотримання.

Факт також, що деякі снаряди, зокрема bash, поводяться по-різному, коли викликаються sh, і це здебільшого видаляє функції з оболонки, а не навпаки.


16

Наскільки мені відомо, оригінальну оболонку Борна не могли використовувати BSD та проект GNU через свою ліцензію.

Тоді оригінальний Unix не мав ліцензії, і проект GNU потребував оболонки, яка була під GPL, щоб вони використовували bash.

Те саме стосується BSD4, батьківського всіх BSD. Завдяки позову AT&T їм потрібно було переписати все джерело з оригіналу Unix, включаючи оболонку Bourne.

У традиційній лінії BSD оболонка Bourne постачалася до 4.3BSD-Reno (але вже не з Net / 2 та наступними 4.4BSD). З ліцензійних причин тоді Кеннет Альмквіст (його часто називають попелом) замінив сумісний з бурном штрих-подібний ш.

Від FreeBSD man sh

Команда sh, оболонка Томпсона, з'явилася у версії 1 AT&T UNIX. Він був витіснений у версії 7 AT&T UNIX оболонкою Bourne, яка успадкувала ім'я sh.

Ця версія SH була переписана в 1989 році під ліцензією BSD після оболонки Борна з AT&T System V Release 4 UNIX

Тож обидва проекти були змушені не використовувати оболонку Борна і влаштуватися на справжню оболонку з відкритим кодом.


7

Були й інші проблеми. Оборона Bourne використовувала sbrk () замість malloc (), і це робило його не дуже портативним.

Після того як Bourne Shell став OpenSource через OpenSolaris, я створив портативну версію hafway, а згодом і справді портативну версію, замінивши sbrk () на malloc () за допомогою Джеффа Коллера (тієї самої людини, яка допомогла уникнути sbrk () у Корн Шелл).

Початкова причина, чому я створив портативну версію «Борнської оболонки», полягає в тому, що мені подобалося, щоб редактор історії, про який я писав для мого «Bsh» між 1982 і 1984 роками, був доступний і в «Борн-шеллі». Тим часом я переніс більшість унікальних характеристик, які я написав для "bsh", до Борнської оболонки.

Це серед інших:

  • Компілює і працює майже скрізь, включаючи Cygwin (майже в 2 рази швидше, ніж баш)
  • Редактор історії з кільцевим буфером LRU
  • вбудований в TERMCAP
  • Розширені псевдоніми (глобальні стійкі псевдоніми, локальні псевдоніми, ....) і разом з "dosh" вбудованим, Bourne Shell є єдиною подібною реалізацією Bourne Shell, яка дозволяє параметризувати псевдоніми.
  • Підтримка редагування складних псевдонімів у редакторі історії в сирому режимі.
  • Отримайте доступ до всіх 32 біт коду виходу (2) за допомогою змінних .sh. *.
  • вдосконалений автоматизований терміни з 6-розрядним дозволом
  • pushd / popd / dirs
  • вбудований "знайти"
  • Труба від stderr
  • Використання vfork () для кращої продуктивності.
  • нарешті виправлені всі задокументовані помилки з SVr4 Bourne Shell, наприклад, призупинення завжди працює в режимі управління роботою. ...

Сторінка чоловіка в Інтернеті знаходиться за адресою: http://schillix.sourceforge.net/man/man1/bosh.1.html Джерела є частиною панелі інструментів schily за адресою:

https://sourceforge.net/projects/schilytools/files/

Я рекомендую використовувати: http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 або більш нову версію.

PS Мені цікаві відгуки


Привіт, Йорге. Навіщо портувати їх на оболонку Борна, а не на оболонку, яка вже була POSIXified як деякі шрифти BSD або pdksh?
Стефан Шазелас

Портинг Bourne Shell був складним завданням, оскільки він не використовує stdio. Це було аналогічним завданням, як взяти оригінальне джерело csh і зробити його компіляцією, замінивши не-stdio printf, написаний у асемблері VAX. Але я вже додав багато новіших функцій POSIX до оболонки Bourne, і мені подобається залишатися з оболонкою Bourne на SchilliX, щоб дозволити їй завантажуватися з / anr / usr в окремих файлових системах, що неможливо з Korn Shell.
schily

Також зауважте, що я хотів переконатися, що швидкість ksh викликана використанням vfork (). Тепер, коли я перетворив Bourne Shell на використання vfork (), це так само швидко, як і останні ksh версії. Це досвід, який ви отримуєте лише починаючи з оригінального вихідного коду Bourne Shell.
schily

Гаразд, але поки ви не зробите цю відповідність POSIX, це, ймовірно, не викликає великого інтересу. Я пам'ятаю, ви запитували в групі ML Austin про несумісність з POSIX оболонки Bourne, це те, над чим ви працюєте (що означало б порушення сумісності з оболонкою Bourne)? Також люди (я щонайменше) вважають синтаксис POSIX sh прогресом над оболонкою Борна. Продовжуючи називати оболонку, отриману від Bourne, оболонка Bourne може створити неправильне враження. Як щодо bimsh (Bourne покращений (ala vi / vim))?
Стефан Шазелас

Мій Bourne Shell вже кращий за ksh у деяких аспектах, наприклад, впроваджуючи кращі псевдоніми, pushd / popd / dirs та підтримку утилізації ресурсів на основі сучасних функцій UNIX, а не те, що робить ksh, що все ще базується на SVr2. Як вам здається, ви зацікавлені і досвідчені в оболонці, я хотів би отримати ідеї про те, що ви хотіли б побачити далі в оболонці Борна після прочитання: schillix.sourceforge.net/man/man1/bosh.1.html Зауважте, що Поки що у мене є новий код # ifdef'd і деякі функції (наприклад, труби stderr) потрібно ввімкнути через set (1).
schily

4

Він пов'язаний з оболонками, які забезпечують 100% зворотну сумісність . Ви не втрачаєте нічого, що має оригінальний оболонку, але отримуєте більше функцій поверх нього. Немає недоліків, тож навіщо пропускати нові функції? Це та сама причина, чому /bin/viзазвичай пов'язана з vim .


5
Мінусом є те, що люди пишуть сценарії, які працюють на їхній одній системі, думаючи, що їх сценарій сумісний, коли його немає. Я колись виправив майже сотню скриптів оболонки Gentoo, які насправді вимагали bash, але називали / bin / sh. Всі вони зламалися, коли я змінив / бін / ш, щоб бути тире замість башти.
Зан Лінкс

3
"no downside" - швидкість. наприклад bash, набагато, набагато повільніше, ніжdash
strugee

@strugee Якщо ви шукаєте швидкість поліпшення ms-діапазону в оболонці, ви, ймовірно, не використовуєте правильний інструмент для роботи.
Кріс Даун

1
@ChrisDown визначити "поліпшення ms-діапазону"?
strugee

2
Синтаксис POSIX sh не повністю сумісний із синтаксисом Bourne sh. Наприклад, IFS=,; rm file1,file2,file3видалить ці 3 файли в оболонці Bourne. Ця (нерозумна) функція була видалена в POSIX sh. Є десятки тонких відмінностей, які можуть спричинити, що сценарій, написаний для оболонки Bourne, по-різному працює з POSIX sh.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.