В большинстве сценариев оболочки, которые я видел (кроме тех, которые я сам не написал), я заметил, что shebang установлен в #!/bin/sh
. Это не очень удивляет меня в старых скриптах, но есть и в довольно новых скриптах.
Есть ли основания для предпочтения /bin/sh
более /bin/bash
, так как bash
это в значительной степени повсеместно, и часто по умолчанию, на многих машинах Linux и BSD восходящих более десяти лет?
/bin/sh
если вы не используете определенныеbash
функции. Однажды вам может понадобиться использовать один из ваших сценариев в системе, в которой он не установлен (удаленный сервер, встроенный компьютер ...)...the answers so far are fairly subjective...
«субъективное» утверждение по существу основано на мнении./bin/bash
должен использоваться только когда явно необходим bash. За 40 с лишним лет, как разработчик, задолго доbash
этого я почти никогда не нуждался в этом явно, кроме как при тестировании. (Я также стараюсь избегать расширений оболочки, но большинство моих сценариев предназначены для распространения.) Многие сценарии в сети также должны быть предназначены для широкого использования.Ответы:
/bin
.источник
/bin/sh
быстрее, если это не такbash
, есть еще несколько систем, таких как OS / X или RHEL, где/bin/sh
естьbash
./bin/sh
это так/bin/bash
. Переключение Ubuntu с bash на dash сломало их всех.#!/bin/bash
если они хотели Bash (в этом нет ничего плохого!). Изменения в основном были сделаны в Debian. Это улучшило взаимодействие с пользователем, оказало ощутимое влияние на время запуска системы. Это также положительно повлияло на безопасность, см. «Shellshock».Большинство системных скриптов в (связанных с Debian: Ubuntu, Mint и т. Д.) Linux написаны так, чтобы работать в более быстром тире, которое по умолчанию / bin / sh в этих системах. Причина двоякая:
Скорость системы. Меньший код тире загружается быстрее, а также работает быстрее. С некоторыми (маленькими?) Дополнительными усилиями (затратами) для программистов сценариев оболочки.
Безопасность. Наличие разнообразия оболочек помогает устойчивости к ошибкам. Системы Debian в большинстве случаев не были уязвимы для шеллшока, потому что оболочка по умолчанию не имела такой уязвимости.
Bash действительно является оболочкой по умолчанию для пользователей , так как она более мощная и имеет гораздо больше элементов, облегчающих программирование. Это также значение по умолчанию
sh
в Mac OS (которое связано с / bin / sh). Тем не менее, вызовbash
с именем ссылкиsh
заставляет его начинаться как posix-совместимая оболочка.источник
eval
с сопутствующей защитой; Точно так же, без встроенной поддержки регулярных выражений, можно использовать внешние команды (при значительном снижении производительности) для сопоставления даже в пределах одной строки и т. д.Другие отмечают, что предпосылки вопроса о том, что оболочка Bourne Again является стандартной и вездесущей, совершенно неверны.
В дополнение к этому, есть действительно веские причины для использования чего-то другого, кроме оболочки Bourne Again, для интерпретации сценариев оболочки. Эти причины мотивировали в Ubuntu и большой проект Debian, в течение ряда лет, чтобы удалить bashisms и сделать так как многие из сценариев оболочки управляют инициализации системы (который был много сценариев оболочки с системой 5
rc
) и установки пакетов / использование удаления в Оболочка Debian Almquist вместо оболочки Bourne Again.Проще говоря: оболочка Bourne Again, битком набитая интерактивными функциями, не является самым быстрым интерпретатором оболочки для POSIX-совместимого сценария оболочки. Поэтому, если кто-то может сделать свои сценарии оболочки POSIX-совместимыми, интерпретируя их с помощью более легкой программы, такой как оболочка Debian Almquist, ваша система будет работать лучше. (В конце концов, Debian пришлось внести небольшие коррективы в оболочку Almquist, чтобы добавить поддержку нескольких не-POSIX-конструкций оболочки, которые просто слишком глубоко и широко внедрены и слишком полезны, чтобы от них избавиться.)
Результатом всего этого стало значительное увеличение производительности начальной загрузки.
Итак, здесь нужно рассмотреть два различных класса оболочки:
Обратите внимание, что говорить об этом как о «предпочтении
/bin/sh
» слишком упрощенно. На самом деле у Debian было как минимум две цели:Перед лицом администраторов, использующих оболочку Debian Almquist, оболочку Z (в режиме POSIX), оболочку Bourne Again (в режиме POSIX), оболочку MirBSD Korn и другие, поскольку
/bin/sh
…... сделать сценарии максимально переносимыми, чтобы переключение между
/bin/sh
отображаемыми объектами не нарушало их; или же… Создание непереносимых сценариев явно нацелено на правильную программу-интерпретатор , а не просто ожидает эту
/bin/sh
карту к ней.Было сделано, что оболочка Debian Almquist является отображением по умолчанию
/bin/sh
вместо оболочки Bourne, так что те сценарии, которые были POSIX-совместимыми (или, точнее, совместимыми с политикой Debian), выполнялись быстрее.И, конечно, как только кто-то входит в это, он может пойти намного дальше; такие как рассмотрение компромиссных эффективности подобных
/bin/true
и/usr/bin/clear
быть сценарии оболочки или скомпилированных программ. Но это выходит за рамки этого ответа, к счастью. ☺Все это, конечно, не является чем-то новым и даже специфичным для Unix. Еще на рубеже веков я написал и опубликовал интерпретатор командной строки, который выпускался как в «интерактивном», так и в «неинтерактивном» виде, объясняя именно это разделение в документе и отмечая разницу между переменными
COMSPEC
иOS2_SHELL
средой. Точно так же обсуждение удаления ошибок в System V Debianrc
и сценариях установки / удаления пакетов восходит к 1990-м годам.дальнейшее чтение
/bin/sh
. Ubuntu Wiki./bin/sh
. Debian Wikiисточник
Schily Bourne Shell
странице руководства , см. Schilytools.sourceforge.net/bosh.html , чтобы люди могли понять, как написать переносимый скрипт (это зависит толькоBourne Shell features
от 1989 года). Что я сделал, так это упомянул все улучшения, которых не было в старых Bourne Shells. Кстати, мне также интересно узнать список bashisms в тире.Да. Превосходный ответ @ Марко обрисовывает в общих чертах это хорошо.
При написании своих собственных сценариев, вы должны указывать шебангу на самое общее, что вы проверяли.
В моей системе (Centos 6.6)
sh
есть ссылка наbash
:Это означает, что я всегда использую
#!/bin/bash
в своем шебанге, если не убедился, что в моем сценарии нет башим.Установив шебанг,
#!/bin/sh
вы обещаете, что скрипт будет работать со всеми реализациямиsh
.Это гораздо большее обещание, чем говорить, что скрипт будет работать с bash.
Вот пример скрипта, который будет вести себя некорректно в зависимости от того, какую
sh
реализацию использует система:При использовании
bash
скрипта будет напечатано:При использовании
dash
скрипта будет напечатано:Если я хочу использовать
#!/bin/sh
то, что мне нужно сделать?checkbashisms
- Обратите внимание, что это не найдет все bashims. Это не нашло башизма в моем сценарии вышеsh
реализацию. Обычноdash
я провожу тестирование , однако ожидаю, что некоторые удары или дашимы все еще могут ускользнуть.На странице DashAsBinSh в вики Ubuntu есть много интересной информации.
источник
/bin/sh
; только POSIX-совместимые.Единственная оставшаяся причина написания сценария оболочки вместо сценария на более мощном и эргономичном языке заключается в том, что переносимость в устаревшие системы с неизвестным набором установленного программного обеспечения более важна, чем любой другой фактор .
/bin/sh
это единственный интерпретатор сценариев, который доступен на всех, кто называет себя Unix. Но на огромном количестве устаревших систем/bin/sh
и связанных утилит даже не совместимы со спецификацией POSIX.1-1996 «оболочка и утилиты», не говоря уже о чем-то более современном. Стандартно совместимые инструменты - это необязательное дополнение, установленное в/usr/xpg4
каком-либо таком неочевидном месте. 1 Сценарии на языке оболочки с переносимым подмножеством еще более утомительны и подвержены ошибкам, чем сценарии на языке оболочки POSIX. (Прочитайтеconfigure
сценарий, сгенерированный Autoconf, если вы мне не верите. Достаточно просто установки, чтобы убедить вас.)Но если вы можете предположить, что установлен любой другой интерпретатор сценариев (например, Bash), то вы можете предположить, что установлен интерпретатор для лучшего языка сценариев . Например, Perl более доступен, чем Bash.
Поэтому вы никогда не должны писать
#! /bin/bash
скрипт, потому что, если это вариант, лучше вариант с языком.1 Например, Solaris 10 и старше поставили оригинальную оболочку Bourne как
/bin/sh
. Мне сообщили, что Solaris 11 обновил его до ksh93.источник
/bin/sh
- это не POSIX.1-1996, а фактически синтаксис, предшествующий POSIX, с оригинальной оболочкой Bourne. Это делает#!/bin/sh
очень плохой сценарий для запуска сценариев с этими выпусками. Переносимые скрипты в Solaris будут использоваться,#!/usr/xpg4/bin/sh
что не будет очень переносимо в других ОС. В последней версии Solaris Oracle Solaris 11, впервые выпущенный в 2011 году,/bin/sh
представляет собой современнуюksh93
версию, которая соответствует последним спецификациям POSIX и имеет множество современных расширений.ash
ее с busybox), и я склонен считать, что zwol прав, что perl более доступен, чем bash.bash
доступно, значит, это лучший язык, поэтому вы никогда не должны писать никакогоbash
кода». Кроме того, как указывает @sixtyfootersdude, вы всегда должны использовать,#!/bin/bash
если только вы не проверили, что ваш скрипт работает с любой оболочкой POSIX.Вы должны на самом деле использовать либо
или же
таким образом вы вызываете любую оболочку по тому, как они установлены в этой системе.
Чтобы быть супер безопасным ( например, в случае однопользовательских перезагрузок), используйте
sh
другое использованиеbash
.источник
the advantage of #!/usr/bin/env python is that it will use whatever python executable appears first in the user's $PATH. The disadvantage of #!/usr/bin/env python is that it will use whatever python executable appears first in the user's $PATH.
Это, вероятно, также относится кsh
иbash
.#!/bin/env
что-либо в переносимом скрипте. Вполне разумно предположить, что/bin/sh
существует и является работающей, POSIX-совместимой оболочкой. С другой стороны, ни одна из моих систем не имеет/bin/env
./bin/sh
. POSIX не требует этого, а скорее определяет другие правила для получения POSIX-совместимой среды на платформе, сертифицированной POSIX./usr/bin/env
не является общедоступным ...