Почему никто не использует настоящую оболочку Bourne как / bin / sh?


55

Я заметил, что практически ни одна из систем, с которыми я когда-либо работал, не имеет /bin/shнастоящего исполняемого файла. Это всегда символическая ссылка dash, bashв режиме POSIX или что-то подобное.

Почему? Каковы недостатки использования истинного, оригинального /bin/sh? (Скорость? Лицензирование?)


3
Вы когда-либо использовали только Linux, верно? Я когда-либо видел "sh as symlink" только в Linux.
Грег Хьюгилл

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

1
@ Жиль согласно одному из ответов, да, начиная с Solaris 11. он связан с ksh.
Strugee

1
@GregHewgill Я также использовал Дарвина, на который он ссылается bash, IIRC.
Strugee

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

Ответы:


38

Я предполагаю отсутствие функций - нет истории команд, нет необычного перенаправления, нет редактирования командной строки. По cshэтим причинам BSD представила оболочку C Еще одним фактором является то, что Подлинная оболочка Bourne была доступна только недавно в форме с открытым исходным кодом . Если вы не лицензировали его, вы не могли бы распространять его. Это сделало его недоступным для бесплатных дистрибутивов и сделало его идеологически неприятным для других дистрибутивов и * BSD.

Но код доступен сейчас. Вы можете посмотреть, скомпилировать его, дать ему вращение.


50
А затем быстро переключитесь на то, что вы использовали раньше.
Игнасио Васкес-Абрамс

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

10
Дело не в отсутствии функций, а в том, что POSIX обязывает shкоманду запускать POSIX-совместимую оболочку, а не унаследованная оболочка Bourne. В то время как POSIX не требует , shчтобы быть в /bin/sh, это самый логичный каталог для того , чтобы быть.
Jlliagre

4
История команд @Bakuriu и редактирование командной строки - это то, что вам не нужно для сценария.
стружка

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 / Linux.

Интересно отметить, что, несмотря на то, что в ответе на ваш вопрос говорится о наиболее одобренном ответе, не отсутствие функций побуждает разработчиков дистрибутивов устанавливать нечто иное, чем унаследованная оболочка Bourne, /bin/shа желание быть как можно более совместимым с POSIX, то есть вести себя как Юникс как ОС. Тот факт, что оболочка POSIX имеет больше возможностей, чем унаследованная оболочка Bourne, является лишь побочным эффектом этой стандартной цели обеспечения соответствия.

Это также факт, что некоторые оболочки, в частности bash, ведут себя по-разному при вызове sh, и это в основном удаляет функции из оболочки, а не наоборот.


16

Насколько я знаю, оригинальная оболочка Bourne не могла использоваться BSD и проектом GNU из-за ее лицензии.

В то время у оригинального Unix не было лицензии, а проекту GNU требовалась оболочка, которая была под GPL, поэтому они использовали bash.

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

В традиционной линейке BSD оболочка Bourne поставлялась до 4.3BSD-Reno (но уже не с Net / 2 и последующими 4.4BSD). По лицензионным причинам он был заменен на борн-совместимый svr4-подобный sh Кеннетом Алмквистом (часто называемым пеплом).

Из FreeBSD man sh

Команда sh, оболочка Томпсона, появилась в версии 1 AT & T UNIX. В версии 7 AT & T UNIX он был заменен оболочкой Bourne, унаследовавшей имя sh.

Эта версия sh была переписана в 1989 году под лицензией BSD после оболочки Bourne из AT & T System V Release 4 UNIX

Таким образом, оба проекта были вынуждены не использовать оболочку Bourne и соглашаться на настоящую оболочку с открытым исходным кодом.


7

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

После того, как оболочка Bourne стала OpenSource через OpenSolaris, я создал переносную версию hafway, а затем действительно переносимую версию, заменив sbrk () на malloc () с помощью Джеффа Коллиера (того же человека, который помог избежать sbrk () в Корн Шелл).

Первоначальная причина, по которой я сделал переносную версию Bourne Shell, заключается в том, что мне нравилось делать редактор истории, который я написал для моего «bsh» между 1982 и 1984 годами, также доступным в Bourne Shell. Тем временем я перенес большую часть уникальных характеристик, которые я написал для «bsh», в Bourne Shell.

Это среди прочего:

  • Компилируется и работает почти везде, включая Cygwin (почти в 2 раза быстрее, чем bash)
  • Редактор истории с кольцевым буфером LRU
  • встроенный TERMCAP
  • Усовершенствованные псевдонимы (глобальные постоянные псевдонимы, локальные псевдонимы и т. Д.) И вместе со встроенной функцией «дош» Bourne Shell - единственная подобная реализация Bourne Shell, которая допускает параметрируемые псевдонимы.
  • Поддержка редактирования сложных псевдонимов в редакторе истории в режиме raw.
  • Доступ ко всем 32 битам кода выхода (2) через переменные .sh. *.
  • Усовершенствованная автоматическая синхронизация с разрешением 6 цифр
  • Pushd / POPD / каталоги
  • встроенная "находка"
  • Труба из стдерр
  • Использование vfork () для лучшей производительности.
  • наконец, исправлены все задокументированные ошибки в SVr4 Bourne Shell, например, suspend всегда работает в режиме управления заданиями. ...

Справочная онлайн-страница находится по адресу: 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 меня интересует обратная связь


Привет Йорг. Зачем переносить их на оболочку Bourne, а не оболочку, которая уже была POSIXified, как некоторые BSD sh или pdksh?
Стефан Шазелас

Перенос Bourne Shell был сложной задачей, так как он не использует stdio. Это было то же самое, что взять оригинальный исходный код csh и заставить его скомпилировать, заменив non-stdio printf, написанный на ассемблере VAX. Но я уже добавил множество новых функций POSIX в Bourne Shell, и мне нравится оставаться с Bourne Shell в SchilliX, чтобы позволить ему загружаться с / anr / usr на отдельных файловых системах, что невозможно в Korn Shell.
Шил

Также обратите внимание, что я хотел убедиться, что скорость ksh вызвана использованием vfork (). Теперь, когда я конвертировал Bourne Shell для использования vfork (), он работает так же быстро, как и последние версии ksh. Это опыт, который вы получаете, только начиная с оригинального исходного кода Bourne Shell.
Шили

Хорошо, но до тех пор, пока вы не сделаете этот sh POSIX-конформант, он вряд ли вызовет большой интерес. Я помню, как вы спрашивали в группе Austin ML о несовместимости с POSIX оболочки Bourne, над чем вы работаете (что будет означать нарушение обратной совместимости с оболочкой Bourne)? Также люди (по крайней мере, я) считают синтаксис POSIX sh прогрессом над оболочкой Bourne. Продолжая называть вашу производную от Bourne оболочкой, оболочка Bourne может произвести неправильное впечатление. Как насчет bimsh (улучшена Bourne (ala vi / vim))?
Стефан Шазелас

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

4

Он связан с оболочками, которые обеспечивают 100% обратную совместимость . Вы не потеряете ничего, что имеет оригинальная оболочка, но получите больше возможностей поверх нее. Там нет недостатков, так почему бы пропустить новые функции? Это та же самая причина, почему /bin/viобычно она связана с vim .


5
Недостатком является то, что люди пишут сценарии, которые работают на их единой системе, думая, что их сценарий совместим, когда это не так. Однажды я исправил почти сто сценариев оболочки Gentoo, которые на самом деле требовали bash, но назывались / bin / sh. Все они сломались, когда я изменил / bin / sh на dash вместо bash.
Zan Lynx

3
«минусов нет» - скорость. например bash, намного, намного медленнее, чемdash
стружка

@strugee Если вы ищете скорость улучшения мс-диапазона в оболочке, вы, вероятно, не используете подходящий инструмент для этой работы.
Крис Даун

1
@ChrisDown определить "улучшения в мс-диапазоне"?
стружка

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.