Какой смысл sh быть связанным с тире?

36

Мне интересно, с чем shсвязана символическая связь dash? Я понимаю, что dashэто должно быть быстрее bash, но я не уверен, почему оригинальная shоболочка не присутствует в sh.

Или, если что-то, почему не shсвязано с bash?

NerdOfCode
источник

Ответы:

72

Короткий ответ на вопрос «почему оригинальная оболочка 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.

Жиль "ТАК - прекрати быть злым"
источник
Я бы сказал, что есть веские причины использовать ksh93 в качестве / bin / sh - это одна из самых мощных доступных оболочек POSIX. Согласился, что вездесущность черты - вопрос времени.
Чарльз Даффи
2
@CharlesDuffy Ksh93 быстрее выполняет сложные задачи, но dash превосходит его во время запуска и для простых сценариев (таких как все вызовы system(3), которые делают приложения), что является доминирующим фактором.
Жиль "ТАК - перестань быть злым"
21

Скорость и соответствие 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?
NerdOfLinux
@NerdOfLinux На самом деле не имеет значения, что / bin / sh поддерживает в дополнение к POSIX (если эти дополнения не нарушают сценарии POSIX); важно то, что он поддерживает все POSIX (и работает максимально быстро). Пока dash выполняет эти требования, / bin / sh может ссылаться на него.
Гунтрам Блом поддерживает Монику
9

В дистрибутивах GNU / Linux «оригинал /bin/sh» фактически является Bash.

GNU хотела Bourne-подобную оболочку, которая была под GPL, поэтому они выбрали Bash /bin/shвместо Bourne, который не был лицензирован по GPL. Современные дистрибутивы Linux унаследовали это решение до такой степени, что оно стало стандартом де-факто для /bin/shBash. Оригинальная оболочка Bourne ("sh") использовалась в других Unix-системах, не относящихся к Linux, даже недавно, в Solaris 10, но она никогда не была опорой в дистрибутивах Linux.

Переключение /bin/shс bash на dash было решением Debian (унаследованным Ubuntu), мотивированным в основном скоростью - это произошло в то время, когда они приложили огромные усилия для повышения скорости загрузки и значительной части времени загрузки ЦП во время работы сценарии инициализации.

Bash по-прежнему используется в качестве интерактивной оболочки по умолчанию для пользователей, но Dash - /bin/shэто та, которая используется для системных сценариев, таких как сценарии инициализации.

Dash очень быстрый, но также очень тесно POSIX-совместимый - стандарт, тесно связанный с оболочкой Bourne. Таким образом, переключаясь с Bash на Dash, мы возвращаемся к оболочке, более тесно связанной с Bourne.

thomasrutter
источник
«Dash очень быстрый, но также очень тесно POSIX-совместимый - стандарт, тесно связанный с оболочкой Bourne». Да, хотя POSIX более тесно связан с ksh, я бы сказал. Я не помню, чтобы оболочка Bourne имела арифметическое расширение `$ (())`, то есть POSIX.
Сергей Колодяжный
1
Кроме того, в Bourne, ^это символ pipe - так echo foo ^ catбудет излучаться foo ^ catв POSIX sh, но fooв Bourne; этот конкретный тест - то, как Autoconf рассказывает обоим.
Чарльз Даффи
Интересно, что под POSIX ш ты имеешь в виду Korn?
Томасруттер
0

/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!

NerdOfLinux
источник
Я уже понял, что совместимость может быть одним из факторов, но я искал не столь очевидный и более глубокий ответ ...
NerdOfCode
2
Так что, если бы я должен был установить оригинальный Bourne Shell shк /bin/sh, будет этот винт до тех загрузочных скриптов?
десерт
Вероятно, лучше всего попробовать это на виртуальной машине, прежде чем развертывать в реальном мире ...
NerdOfCode
2
Вы должны оставить /bin/shкак оболочку, предоставляемую дистрибутивом, так как это то, на что они нацелены с помощью своих загрузочных скриптов и тому подобного. Но если бы вы заменили его на Bourne, он был бы совместим. Я предположил бы, что будут поломки, хотя, только из-за незначительных различий против огромного количества кода. Конечно, вы можете свободно использовать любую оболочку в ваших собственных сценариях с настраиваемым хеш-бенгом.
Томасруттер
1
@mckenzm Оболочка, на которую /bin/shссылается оболочка , отделена от той, которую конкретный пользователь установил в качестве начальной оболочки для входа. Цель /bin/shне зависит от того, какой пользователь смотрит, и вы делаете необходимость использования sudo-OR , другие средства действовать в качестве корневого пользователя - изменить его. Кроме того, в целом и для любого пакета, dpkg-reconfigureдолжен быть запущен от имени пользователя root. В отличие от этого, пользователям обычно разрешается изменять собственную начальную оболочку входа в систему и могут делать это с помощью chshкоманды. Имя первоначальной оболочки входа в систему также входит $SHELLи используется для некоторых интерактивных оболочек без регистрации.
Элия ​​Каган