Какой смысл sh быть связанным с тире?
Мне интересно какой смысл sh
будучи символически связан с dash
является? Я это понимаю dash
должен быть быстрее чем bash
, но я не уверен, почему оригинал sh
оболочки нет в sh
,
Или, если что-нибудь, почему нет sh
связано с bash
?
4 ответа
Короткий ответ на вопрос "почему оригинальная оболочка sh отсутствует в sh
В том, что нет оригинального ш.
Ну, хорошо, есть: это оболочка Томпсона. Версия 1 имела некоторые особенности, которые мы знаем сегодня, в частности перенаправление и каналы (читайте статью Денниса Ричи о ранней истории Unix). Более поздние версии добавили такие функции, как фоновое выполнение с &
, globbing (реализованный с помощью внешней программы) и некоторые формы цитирования, но у него не было переменных или вложенных структур управления. Условия и циклы были предоставлены через внешние программы 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, которая mirabilos), но я не помню дистрибутив Linux, использующий pdksh как /bin/sh
Я не знаю почему, я думаю, потому что дистрибутивы Linux всегда были дистрибутивами GNU/Linux, в основном поставляли версии GNU любого инструмента, для которого версия GNU существовала.
Было также несколько открытых реализаций sh
называемый "пепел", в первую очередь оболочка Almquist, но они были очень неполными, в них отсутствовали некоторые функции POSIX, которые люди хотели использовать. Программист, который был сопровождающим Debian, Герберт Сюй, расширил пепел, чтобы сделать его POSIX-совместимым. В конце концов его версия была переименована в тире, и был некоторый толчок, чтобы сделать это /bin/sh
в Debian вместо bash. Ubuntu начал свою работу до того, как Debian начал систематически обрабатывать bashisms (использование специфичной для bash функциональности в #!/bin/sh
скрипты) как ошибки. Оба переключились позже ( Ubuntu 6.10, Debian только в 2009 году ( это была цель для lenny, но переключение было сделано только после выпуска lenny, то есть в squeeze)).
Основная причина использования Dash, а не Bash, как /bin/sh
в том, что это значительно быстрее Это было особенно важно для Ubuntu, который с самого начала стремился сократить время загрузки. Dash также имеет тенденцию использовать меньше памяти, чем bash, что несколько важно для сценариев-обёрток, которые остаются просто для того, чтобы немного очиститься при выходе из базовой программы. Еще одним преимуществом dash является то, что он опирается только на libc (базовая системная библиотека), тогда как bash также опирается на библиотеки поддержки терминалов (без них невозможно запустить даже запуск сценария); это означает, что у dash больше шансов продолжить работу на сломанной системе.
В какой-то момент в течение 21-го века оболочка Korn стала открытой, и появились версии оболочки Bourne с открытыми исходными кодами (старые версии, потому что разработка прекратилась много лет назад). Но dash и bash были слишком прочно укоренились в мире Linux, чтобы они могли получить какое-либо признание, особенно оболочку Bourne, поскольку ее ценность сегодня только историческая. Dash сместил Bash, потому что он имел явные преимущества, но ни один из других претендентов не имеет решающего преимущества, как /bin/sh
,
Скорость и соответствие 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
В дистрибутивах GNU/Linux "оригинальный /bin/sh
"на самом деле Баш.
GNU хотела Bourne-подобную оболочку, которая была под GPL, поэтому они выбрали Bash для своих /bin/sh
вместо Bourne, который не был лицензирован по лицензии GPL. Современные дистрибутивы Linux унаследовали это решение до такой степени, что оно стало стандартом де-факто для /bin/sh
быть Баш. Оригинальная оболочка Bourne ("sh") использовалась в других Unix-системах, не относящихся к Linux, даже недавно, в Solaris 10, но она никогда не была опорой в дистрибутивах Linux.
Переключение /bin/sh
Решение от bash до dash было решением Debian (унаследованным Ubuntu), мотивированным в основном скоростью - оно пришло в то время, когда они приложили огромные усилия для повышения скорости загрузки и значительной части времени загрузки ЦП во время работы init скрипты.
Bash продолжает использоваться в качестве интерактивной оболочки по умолчанию для пользователей, но Dash /bin/sh
и тот, который выполняется для системных сценариев, таких как сценарии инициализации.
Dash очень быстрый, но также очень тесно POSIX-совместимый - стандарт, тесно связанный с оболочкой Bourne. Таким образом, переключаясь с Bash на Dash, мы возвращаемся к оболочке, более тесно связанной с Bourne.
/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!