В чем разница между #! / Bin / sh и #! / Bin / bash?

Если я напишу,

#!/bin/bash
echo "foo"

или

#!/bin/sh
echo "foo"

оба дают одинаковые. Я видел некоторые сценарии, начинающиеся с #!/bin/sh или #!/bin/bash. Есть ли разница между ними?

342
задан 11 February 2019 в 13:05

4 ответа

bash и sh - два разных снаряды. По сути, bash - это sh , с большим количеством функций и улучшенным синтаксисом. Большинство команд работают одинаково, но они разные.

Сказав это,вы должны понимать, что / bin / sh в большинстве систем будет символической ссылкой и не будет вызывать sh . В Ubuntu / bin / sh используется для ссылки на bash , типичное поведение в дистрибутивах Linux, но теперь изменилось на связывание с другой оболочкой, называемой dash . Я бы использовал bash , поскольку это в значительной степени стандарт (или, по крайней мере, наиболее распространенный, исходя из моего опыта). Фактически, проблемы возникают, когда сценарий bash будет использовать #! / Bin / sh , потому что создатель сценария предполагает, что ссылка ведет на bash , хотя это не обязательно.

Для получения дополнительной информации http://man.cx/sh , http://man.cx/bash .

298
ответ дан 11 February 2019 в 13:05

GNU Bash: #! / bin / bash ; Оболочка POSIX: #! / Bin / sh .

9
ответ дан 11 February 2019 в 13:05

В дополнение к предыдущим ответам, даже если / bin / sh является символической ссылкой на / bin / bash , #! / Bin / sh не полностью эквивалентен #! / Bin / bash .

Из bash ( 1) страница руководства :

«Если bash вызывается с именем sh, он пытается имитировать запуск поведение исторических версий sh максимально близко, в то время как также соответствует стандарту POSIX. "

Например, специфический синтаксис bash:

 exec  > >(tee logfile.txt)

дает ошибку в оболочке, начинающуюся с #! / bin / sh , даже с sh-> bash установлена ​​символическая ссылка.

25
ответ дан 11 February 2019 в 13:05

В Linux и других Unix-подобных системах у вас есть выбор из нескольких оболочек.

Оболочка отвечает не только за отображение вашего маленького приглашения, но интерпретировать ваши команды, особенно если вы вводите сложную логику, такую ​​как конвейеры, условные выражения и т. д.

bash - наиболее распространенная оболочка, используемая в качестве оболочки по умолчанию для пользователей систем Linux. Это духовный потомок других оболочек, используемых на протяжении всей истории Unix. Его имя, bash , является аббревиатурой от Bourne-Again Shell, дань уважения оболочке Bourne, которую она была разработана для замены, хотя она также включает в себя функции из C Shell и Korn Shell.

Он запущен. в наши дни из / bin / bash - здесь он будет доступен для любой системы с bash.

Однако не только пользователи используют оболочки. Сценарии ( сценарии оболочки ) нуждаются в оболочках для их интерпретации. Когда вы запускаете сценарий оболочки, ваша система должна запустить процесс оболочки для выполнения вашего сценария.

Проблема в том, что разные оболочки имеют крошечные несоответствия между собой, и когда дело доходит до запуска сценариев, они могут быть настоящими проблема. bash имеет довольно много возможностей создания сценариев, которые уникальны только для bash, но не для других оболочек. Это нормально, если вы всегда собираетесь использовать bash для запуска этих скриптов. Другие оболочки могут попытаться либо эмулировать bash, либо придерживаться стандарта POSIX, который bash поддерживает довольно хорошо (хотя и добавляет свои собственные расширения).

В верхней части сценария оболочки можно указать, какую оболочку следует запускать с использованием шебанга. Сценарий может указывать #! / Bin / bash в первой строке, что означает, что сценарий всегда следует запускать с помощью bash, а не другой оболочки.

/ bin / sh - исполняемый файл представляющая системную оболочку . Фактически, это обычно реализуется как символическая ссылка, указывающая на исполняемый файл для любой оболочки, которая является системной оболочкой. Системная оболочка - это своего рода оболочка по умолчанию, которую должны использовать системные сценарии. В дистрибутивах Linux долгое время это обычно была символическая ссылка на bash , настолько, что это стало своего рода соглашением всегда связывать / bin / sh с bash или оболочкой, совместимой с bash. Однако в последние пару лет Debian (и Ubuntu) решил переключить системную оболочку с bash на dash - аналогичную оболочку - нарушив давнюю традицию Linux (ну, GNU) использования bash для / bin / sh. Dash рассматривается как более легкая и намного более быстрая оболочка, которая может быть полезной для скорости загрузки (и других вещей, требующих большого количества сценариев оболочки, например сценариев установки пакетов).

Dash довольно хорошо совместим с bash, поскольку основан на по тому же стандарту POSIX. Однако он не реализует специфичные для bash расширения. Существуют сценарии, которые используют #! / Bin / sh (системную оболочку) в качестве своего шебанга, но для которых требуются расширения, специфичные для bash. В настоящее время это считается ошибкой , которая должна быть исправлена ​​ Debian и Ubuntu, которым требуется, чтобы / bin / sh работал при указании на тире.

Хотя системная оболочка Ubuntu ] указывает на тире, ваша оболочка входа в качестве пользователя в это время продолжает быть bash. То есть, когда вы входите в эмулятор терминала в любом месте Linux, вашей оболочкой входа будет bash. Скорость работы не является большой проблемой, когда оболочка используется в интерактивном режиме, а пользователи знакомы с bash (и могут иметь специфичные для bash настройки в своем домашнем каталоге).

Что следует использовать при написании сценариев

Если вашему скрипту требуются функции, поддерживаемые только bash,используйте #! / bin / bash .

Но если это вообще возможно, было бы хорошо убедиться, что ваш сценарий POSIX-совместим, и используйте #! / bin / sh , который всегда должен достаточно надежно указывать на предпочтительную POSIX-совместимую системную оболочку в любой установке.

100
ответ дан 11 February 2019 в 13:05

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

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