Какой смысл sh, связываемого с тире?

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

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

36
задан 14 November 2017 в 18:46

4 ответа

Короткий ответ на, “почему исходная оболочка sh не присутствует в sh” это нет никакого исходного sh.

Ну, хорошо, существует: это - оболочка Thompson. Версия 1 имела некоторые функции, которые мы знаем сегодня, в особенности перенаправление и каналы (прочитайте газету Dennis Ritchie на ранней истории Unix). Более поздние дополнительные функции версий, такие как фоновое выполнение с &, globbing (реализованный с внешней программой), и некоторые формы заключения в кавычки, но это не имело переменных или вложило управляющие структуры. Условные выражения и циклы были обеспечены с помощью внешних программ if (который взял одно условие и одну команду как аргументы), и goto (который работавший, меняя положение файла его родителя в файле сценария).

В 1979, в Unix V7, оболочка Thompson была заменена как /bin/sh Оболочкой Bourne. Первый выпуск уже имел многие функции, которые присутствуют в тире сегодня, и последующие версии представили намного больше. Несколько лет спустя оболочка Korn прибыла на сцену с растущим набором функций; много вариантов Unix установили его под именем ksh.

В 1992 POSIX шифровал минимальный набор sh функции, который был в основном Bourne плюс несколько вещей. Любая система, которая назвала себя “Unix”, должна была реализовать, по крайней мере, эти опции. Коммерческие системы Unix обычно использовали ksh в качестве POSIX sh, но у некоторых (например, OSF/1) было их собственное.

Ни Оболочка Bourne, ни оболочка Korn не были открытым исходным кодом до справедливо недавно, поэтому когда мир Linux начал формироваться в середине 1990-х, они не были доступны. /bin/sh должно было быть что-то еще. Большинство дистрибутивов Linux пошло для удара, оболочки из проекта GNU, который имел тенденцию быть между Bourne и Korn с точки зрения сценариев функций, и намного лучше, чем любой для интерактивного использования). Единственная жизнеспособная альтернатива была pdksh (“общественное достояние оболочка Korn”), свободное (теперь прекращенный, но живущий на как mksh, который активно разрабатывается), но я не помню дистрибутива Linux с помощью pdksh как /bin/sh, Я не знаю, почему, я предполагаю, потому что дистрибутивами Linux всегда был GNU/дистрибутивы Linux, в основном поставляя версии GNU любого инструмента, для которого действительно существовала версия GNU.

Было также несколько реализаций с открытым исходным кодом sh названный “пеплом”, прежде всего оболочка Almquist, но они были очень неполными, испытав недостаток в некоторых функциях POSIX, которые люди хотели использовать. Программист, который был специалистом по обслуживанию Debian, Herbert Xu, расширил пепел для создания этого POSIX совместимый. В конечном счете его версия была переименована для подчеркивания штриховой линией, и было некоторое нажатие для создания ее /bin/sh в Debian вместо удара. Ubuntu, начатая перед Debian, запущенным для систематической обработки bashisms (использование определенной для удара функциональности в #!/bin/sh сценарии) как ошибки. Оба переключили более позднее (Ubuntu 6.10, Debian только в 2009 (это была цель для lenny, но переключатель был только сделан после выпуска lenny, т.е. в сжатии)).

Основная причина использования тире как, а не удар как /bin/sh это, это значительно быстрее. Это было особенно важно для Ubuntu, которая стремилась сохранить время начальной загрузки коротким с начала. Тире также имеет тенденцию использовать меньше памяти, чем удар, который несколько важен для сценариев обертки, которые остаются вокруг только, чтобы сделать немного очистки, когда базовая программа выходит. Другое преимущество тире - то, что он только полагается на libc (базовая системная библиотека), тогда как удар также полагается на терминальные вспомогательные библиотеки (он не может запуститься без них, даже для запущения скрипта); это означает, что тире имеет лучший шанс продолжать работать над поврежденной системой.

В какой-то момент в течение 21-го века, оболочка Korn пошла открытый исходный код, и версии с открытым исходным кодом Оболочки Bourne появились (старые версии, потому что разработка прекратилась за годы до этого). Но тире и удар были слишком твердо укреплены в мире Linux для них для получения любого принятия, особенно Оболочка Bourne, так как ее ценность сегодня является только исторической. Подчеркните штриховой линией перемещенный удар, потому что он обладал ясными преимуществами, но ни один из других соперников не имеет решающего преимущества как /bin/sh.

71
ответ дан 23 November 2019 в 00:18

Скорость и соответствие POSIX (другими словами, мобильность) являются основными факторами. Помните это /bin/sh предназначен для системных сценариев, которые могут или не могли прибыть из более старых версий Ubuntu и/или других систем.

Несомненно, солнечные функции bash прохладны для использования для нас пользователей, но когда дело доходит до рабочей вещи в среде, где необходимо управлять несколькими различными серверами/системами - наличие POSIX, совместимая оболочка делает всех из различия. Особенно, если Вы - новый системный администратор и наследованная среда со многими сценариями.

Что касается того, почему не присутствует исходная Оболочка Bourne, это просто - это - собственный продукт, первоначально принадлежавший AT&T Bell Labs.

Кроме того, существует на самом деле явное объяснение на Ubuntu Wiki об этом:

Почему это изменение было внесено? Основная причина переключить оболочку по умолчанию была эффективностью. удар является превосходной полнофункциональной оболочкой, подходящей для интерактивного использования; действительно, это - все еще оболочка входа в систему по умолчанию. Однако это является довольно большим и медленным, чтобы запустить и работать для сравнения с тире. Большое количество экземпляров оболочки запускается как часть процесса начальной загрузки Ubuntu. Вместо того, чтобы изменять каждого из них индивидуально для выполнения явно под/bin/dash, изменение, которое потребовало бы значительного текущего технического обслуживания и которое было бы склонно регрессировать, если бы не обращенное пристальное внимание, группа разработчиков ядра Ubuntu чувствовала, что было лучше просто изменить оболочку по умолчанию. Улучшения скорости начальной загрузки Ubuntu 6.10 часто неправильно приписывались Выскочке, которая является прекрасной платформой для будущей разработки init системы, но в Ubuntu 6.10, прежде всего, работал в режиме эмуляции System V только с маленькими изменениями в поведении. Эти улучшения происходили на самом деле в основном из-за измененного/bin/sh.

И вот примечание о мобильности:

Руководство политики Debian долго передавало под мандат тот "сценарии оболочки, указывающие '/bin/sh', поскольку интерпретатор должен только использовать функции POSIX"; на самом деле это требование существовало так как задолго до начала проекта Ubuntu. Кроме того, любые сценарии оболочки, которые ожидали быть портативными к другим системам Unix, такими как BSDs или Солярис, уже соблюдали это требование. Таким образом мы чувствовали, что влияние совместимости этого изменения будет минимально.

См. https://wiki.ubuntu.com/DashAsBinSh

21
ответ дан 23 November 2019 в 00:18

В GNU/дистрибутивах Linux, "оригинале /bin/sh"на самом деле Bash.

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

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

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

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

9
ответ дан 23 November 2019 в 00:18

/bin/sh связан с /bin/dash поскольку то, чему я верю, является причинами совместимости. Много сценариев просто запускаются с

#!/bin/sh

таким образом путем перемещения в dash и не делая символьную ссылку, большому количеству сценариев не удалось бы работать правильно (или вообще) если /bin/sh не существовал вообще.

Изменение было внесено от bash кому: dash потому что согласно https://wiki.ubuntu.com/DashAsBinSh:

Основная причина переключить оболочку по умолчанию была эффективностью. удар является превосходной полнофункциональной оболочкой, подходящей для интерактивного использования; действительно, это - все еще оболочка входа в систему по умолчанию. Однако это является довольно большим и медленным, чтобы запустить и работать для сравнения с тире. Большое количество экземпляров оболочки запускается как часть процесса начальной загрузки Ubuntu. Вместо того, чтобы изменять каждого из них индивидуально для выполнения явно под/bin/dash, изменение, которое потребовало бы значительного текущего технического обслуживания и которое было бы склонно регрессировать, если бы не обращенное пристальное внимание, группа разработчиков ядра Ubuntu чувствовала, что было лучше просто изменить оболочку по умолчанию.

sh не связан с bash, потому что

Руководство политики Debian долго передавало под мандат тот "сценарии оболочки, указывающие '/bin/sh', поскольку интерпретатор должен только использовать функции POSIX"

Если Вы хотите использовать bash как /bin/sh:

Если проблемы более широко распространены, и Вы хотите возвратить системную оболочку по умолчанию, то можно дать системе управления пакета команду прекращать устанавливать тире как/bin/sh:

sudo dpkg-reconfigure dash

Существуют некоторые функции это dash обеспечивает тот удар не делает, как:

существует даже ничтожный шанс, что существует несколько сценариев, которые теперь зависят от некоторой функции тире, которого не обеспечивает удар!

0
ответ дан 23 November 2019 в 00:18

Другие вопросы по тегам:

Похожие вопросы: