В чем смысл привязки к тире?

17

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

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

    
задан NerdOfCode 14.11.2017 в 23:20
источник

4 ответа

46

Короткий ответ на «почему исходная оболочка sh отсутствует в sh » заключается в том, что нет оригинальной sh.

Хорошо, хорошо, это: оболочка Thompson . В версии 1 были некоторые функции, которые мы знаем сегодня, в частности перенаправление и каналы (читайте документ Денниса Ричи о ранняя история Unix ). Более поздние версии добавили такие функции, как фоновое исполнение с & , globbing (реализовано с помощью внешней программы ) и некоторые формы цитирования, но у него не было переменных или вложенных структур управления. Условные и циклы были предоставлены через внешние программы if (которые принимали одно условие и одну команду в качестве аргументов) и < a href="https://etsh.io/man/goto.1.txt"> goto (который работал, изменяя положение файла его родителя в файле сценария).

В 1979 году в Unix V7 оболочка Thompson была заменена на /bin/sh на Bourne shell . В первом выпуске уже были многие функции , которые присутствуют сегодня в тире, и в последующих версиях введена много больше . Несколько лет спустя на сцену вышла оболочка 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 shell»), бесплатный (теперь прекращенный, но живущий как mksh , который активно развивается ), но я не помню дистрибутив Linux, использующий pdksh как /bin/sh , я не знаю почему, я думаю, потому, что дистрибутивы Linux всегда были дистрибутивами GNU / Linux, в основном отправляя версии GNU любого инструмента, для которого существовала версия GNU.

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

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

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

    
ответ дан Gilles 15.11.2017 в 00:48
источник
18

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

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

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

Кроме того, на Ubuntu wiki есть явное объяснение:

  

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

А вот записка о переносимости:

  

В руководстве по политике Debian уже давно указано, что «сценарии оболочки, определяющие« / bin / sh »в качестве интерпретатора, должны использовать только функции POSIX»; на самом деле это требование существует уже задолго до начала проекта Ubuntu. Более того, любые сценарии оболочки, которые ожидали быть переносимыми в другие Unix-системы, такие как BSD или Solaris, уже выполнили это требование. Таким образом, мы чувствовали, что влияние этого изменения на совместимость было бы минимальным.

См. Ссылка

    
ответ дан Sergiy Kolodyazhnyy 15.11.2017 в 00:19
8

В дистрибутивах GNU / Linux «исходный /bin/sh » на самом деле является Bash.

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

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

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

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

    
ответ дан thomasrutter 15.11.2017 в 00:30
0

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

#!/bin/sh

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

Изменение было сделано из bash в dash , потому что согласно Ссылка :

  

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

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

  

В руководстве по политике Debian уже давно указано, что «сценарии оболочки, определяющие« / bin / sh »в качестве интерпретатора, должны использовать только функции POSIX«

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

  

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

sudo dpkg-reconfigure dash

Есть некоторые функции, которые dash обеспечивает, что bash не работает, как:

  

есть даже внешний шанс, что есть несколько скриптов, которые теперь зависят от некоторой черты тире, которую bash не предоставляет!

    
ответ дан NerdOfLinux 14.11.2017 в 23:23