Мне интересно, с чем 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 есть подробное объяснение:
Почему было сделано это изменение? Основной причиной переключения оболочки по умолчанию была эффективность. bash - превосходная полнофункциональная оболочка, подходящая для интерактивного использования; действительно, это все еще оболочка входа по умолчанию. Тем не менее, он довольно большой и медленно запускается и работает по сравнению с тире. Большое количество экземпляров оболочки запускается как часть процесса загрузки Ubuntu. Вместо того, чтобы менять каждый из них по отдельности, чтобы он выполнялся в явном виде в / bin / dash, это изменение, которое потребовало бы значительного постоянного обслуживания и которое могло бы регрессировать, если бы не было уделено пристальное внимание, команда разработчиков ядра Ubuntu считала, что лучше всего просто изменить оболочка по умолчанию. Улучшения скорости загрузки в Ubuntu 6.10 часто ошибочно приписывают Upstart, который является хорошей платформой для будущего развития системы init, но в Ubuntu 6. 10 в основном работал в режиме совместимости с System V с небольшими изменениями поведения. Эти улучшения были в основном связаны с изменением / bin / sh.
И вот заметка о переносимости:
В руководстве по политике Debian долгое время указывалось, что «сценарии оболочки, определяющие« / bin / sh »в качестве интерпретатора, должны использовать только функции POSIX»; на самом деле, это требование было введено задолго до начала проекта Ubuntu. Более того, любые сценарии оболочки, которые, как ожидается, будут переносимы на другие системы Unix, такие как BSD или Solaris, уже удовлетворяют этому требованию. Таким образом, мы чувствовали, что влияние этого изменения на совместимость будет минимальным.
Смотрите 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
тем, что я считаю, из соображений совместимости. Многие сценарии начинаются с
#!/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
:
Если проблемы более распространены, и вы хотите изменить системную оболочку по умолчанию обратно, то вы можете дать команду системе управления пакетами прекратить установку dash как / bin / sh:
sudo dpkg-reconfigure dash
Есть некоторые функции, которые dash
обеспечивают bash, а не:
Существует даже внешняя вероятность того, что есть несколько сценариев, которые теперь зависят от некоторой функции dash, которую не предоставляет bash!
sh
к /bin/sh
, будет этот винт до тех загрузочных скриптов?
/bin/sh
как оболочку, предоставляемую дистрибутивом, так как это то, на что они нацелены с помощью своих загрузочных скриптов и тому подобного. Но если бы вы заменили его на Bourne, он был бы совместим. Я предположил бы, что будут поломки, хотя, только из-за незначительных различий против огромного количества кода. Конечно, вы можете свободно использовать любую оболочку в ваших собственных сценариях с настраиваемым хеш-бенгом.
/bin/sh
ссылается оболочка , отделена от той, которую конкретный пользователь установил в качестве начальной оболочки для входа. Цель /bin/sh
не зависит от того, какой пользователь смотрит, и вы делаете необходимость использования sudo
-OR , другие средства действовать в качестве корневого пользователя - изменить его. Кроме того, в целом и для любого пакета, dpkg-reconfigure
должен быть запущен от имени пользователя root. В отличие от этого, пользователям обычно разрешается изменять собственную начальную оболочку входа в систему и могут делать это с помощью chsh
команды. Имя первоначальной оболочки входа в систему также входит $SHELL
и используется для некоторых интерактивных оболочек без регистрации.