Мне интересно, с чем 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
на оболочку Борна . В первом выпуске уже было много функций , которые присутствуют в dash сегодня, а в последующих версиях появилось еще больше . Несколько лет спустя на сцену вышла оболочка Korn с растущим набором функций; многие варианты Unix установили его под своим именем ksh
.
В 1992 году POSIX кодифицировал минимальный набор sh
функций, который был в основном Bourne плюс несколько вещей. Любая система, которая называла себя «Unix», должна была реализовать хотя бы эти функции. Коммерческие системы Unix обычно использовали ksh в качестве POSIX sh, но некоторые (например, OSF / 1 ) имели свои собственные.
До недавнего времени ни оболочка Bourne, ни оболочка Korn не были с открытым исходным кодом, поэтому, когда мир Linux начал формироваться в середине 1990-х годов, они были недоступны. /bin/sh
должно было быть что-то еще. В большинстве дистрибутивов Linux использовалась bash , оболочка из проекта GNU, которая, как правило, находилась между Bourne и Korn с точки зрения возможностей сценариев, и намного лучше, чем любая из них для интерактивного использования). Единственной жизнеспособной альтернативой был pdksh («общедоступная оболочка Korn»), бесплатная (сейчас она снята с производства, но сейчас работает под именем mksh , которая активно развивается ), но я не помню дистрибутив Linux, использующий pdksh как/bin/sh
Я не знаю почему, я думаю, потому что дистрибутивы Linux всегда были дистрибутивами GNU / Linux, в основном поставляли версии GNU любого инструмента, для которого версия GNU существовала.
Было также несколько реализаций с открытым исходным кодом, sh
называемых «ash», в первую очередь оболочка Almquist , но они были очень неполными, и в них отсутствовали некоторые функции POSIX, которые люди хотели использовать. Программист, который был сопровождающим Debian, Герберт Сюй , расширил пепел, чтобы сделать его POSIX-совместимым. В конце концов, его версия была переименована в dash, и был какой-то толчок сделать ее /bin/sh
в Debian вместо bash. Ubuntu начал работу до того, как Debian начал систематически обрабатывать bashisms (использование bash-специфичных функций в #!/bin/sh
скриптах) как ошибки . Оба поменялись позже ( Ubuntu 6.10 , Debian только в 2009 году ( это была цель для lenny но переключение было сделано только после выпуска Lenny, т.е. в сжатие)).
Основная причина использования тира в качестве , а не Баша в /bin/sh
том , что это значительно быстрее. Это было особенно важно для Ubuntu, который с самого начала стремился сократить время загрузки. Dash также имеет тенденцию использовать меньше памяти, чем bash, что несколько важно для сценариев-обёрток, которые остаются просто для того, чтобы немного очиститься при выходе из базовой программы. Еще одним преимуществом dash является то, что он опирается только на libc (базовая системная библиотека), тогда как bash также опирается на библиотеки поддержки терминала (без них невозможно запустить даже запуск скрипта); это означает, что у dash больше шансов продолжить работу на сломанной системе.
В какой-то момент в течение 21-го века оболочка Korn стала открытой, и появились версии оболочки Bourne с открытыми исходными кодами (старые версии, потому что разработка прекратилась много лет назад). Но dash и bash были слишком прочно укоренились в мире Linux, чтобы они могли получить какое-либо признание, особенно оболочку Bourne, поскольку ее ценность сегодня только историческая. Dash сместил Bash, потому что он имел явные преимущества, но ни один из других претендентов не имеет решающего преимущества /bin/sh
.
system
(3), которые делают приложения), что является доминирующим фактором.Скорость и соответствие POSIX (другими словами, портативность) являются основными факторами. Помните, что
/bin/sh
это предназначено для системных сценариев, которые могут или не могут быть получены из более старых версий Ubuntu и / или других систем.Несомненно, блестящие функции
bash
удобны для нас, пользователей, но когда дело доходит до запуска в среде, где вам приходится управлять несколькими различными серверами / системами - наличие POSIX-совместимой оболочки имеет большое значение. Особенно, если вы новый системный администратор и унаследованная среда со многими сценариями.Что касается того, почему оригинальной оболочки Bourne нет, то все просто: это проприетарный продукт, изначально принадлежавший AT & T Bell Labs.
Кроме того, на Wiki Ubuntu есть подробное объяснение:
И вот заметка о переносимости:
Смотрите https://wiki.ubuntu.com/DashAsBinSh
источник
dash
поддерживает функции, которые не требуютсяPOSIX
?В дистрибутивах GNU / Linux «оригинал
/bin/sh
» фактически является Bash.GNU хотела Bourne-подобную оболочку, которая была под GPL, поэтому они выбрали Bash
/bin/sh
вместо Bourne, который не был лицензирован по GPL. Современные дистрибутивы Linux унаследовали это решение до такой степени, что оно стало стандартом де-факто для/bin/sh
Bash. Оригинальная оболочка Bourne ("sh") использовалась в других Unix-системах, не относящихся к Linux, даже недавно, в Solaris 10, но она никогда не была опорой в дистрибутивах Linux.Переключение
/bin/sh
с bash на dash было решением Debian (унаследованным Ubuntu), мотивированным в основном скоростью - это произошло в то время, когда они приложили огромные усилия для повышения скорости загрузки и значительной части времени загрузки ЦП во время работы сценарии инициализации.Bash по-прежнему используется в качестве интерактивной оболочки по умолчанию для пользователей, но Dash -
/bin/sh
это та, которая используется для системных сценариев, таких как сценарии инициализации.Dash очень быстрый, но также очень тесно POSIX-совместимый - стандарт, тесно связанный с оболочкой Bourne. Таким образом, переключаясь с Bash на Dash, мы возвращаемся к оболочке, более тесно связанной с Bourne.
источник
ksh
, я бы сказал. Я не помню, чтобы оболочка Bourne имела арифметическое расширение `$ (())`, то есть POSIX.^
это символ pipe - такecho foo ^ cat
будет излучатьсяfoo ^ cat
в POSIX sh, ноfoo
в Bourne; этот конкретный тест - то, как Autoconf рассказывает обоим./bin/sh
связано с/bin/dash
тем, что я считаю, из соображений совместимости. Многие сценарии начинаются споэтому, переходя на
dash
символическую ссылку и не создавая ее, многие сценарии не будут работать должным образом (или вообще не будут), если их/bin/sh
вообще не будет.Изменение было сделано с
bash
поdash
потому что согласно https://wiki.ubuntu.com/DashAsBinSh :sh
не связанbash
, потому чтоЕсли вы хотите использовать
bash
как/bin/sh
:Есть некоторые функции, которые
dash
обеспечивают bash, а не:источник
sh
к/bin/sh
, будет этот винт до тех загрузочных скриптов?/bin/sh
как оболочку, предоставляемую дистрибутивом, так как это то, на что они нацелены с помощью своих загрузочных скриптов и тому подобного. Но если бы вы заменили его на Bourne, он был бы совместим. Я предположил бы, что будут поломки, хотя, только из-за незначительных различий против огромного количества кода. Конечно, вы можете свободно использовать любую оболочку в ваших собственных сценариях с настраиваемым хеш-бенгом./bin/sh
ссылается оболочка , отделена от той, которую конкретный пользователь установил в качестве начальной оболочки для входа. Цель/bin/sh
не зависит от того, какой пользователь смотрит, и вы делаете необходимость использованияsudo
-OR , другие средства действовать в качестве корневого пользователя - изменить его. Кроме того, в целом и для любого пакета,dpkg-reconfigure
должен быть запущен от имени пользователя root. В отличие от этого, пользователям обычно разрешается изменять собственную начальную оболочку входа в систему и могут делать это с помощьюchsh
команды. Имя первоначальной оболочки входа в систему также входит$SHELL
и используется для некоторых интерактивных оболочек без регистрации.