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

213

, если я пишу,

#!/bin/bash
echo "foo"

или

#!/bin/sh
echo "foo"

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

    
задан Rahul Virpara 25.05.2012 в 05:59
источник

3 ответа

182

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

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

Для получения дополнительной информации Ссылка , Ссылка .

    
ответ дан reverendj1 25.05.2012 в 06:08
источник
62

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

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

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

В настоящее время он запускается из /bin/bash - любая система с bash будет доступна здесь.

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

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

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

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

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

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

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

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

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

    
ответ дан thomasrutter 25.05.2012 в 10:31
15

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

Из справочной страницы bash (1) :

"If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well."

Например, синтаксис bash:

 exec  > >(tee logfile.txt)

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

    
ответ дан AnkiF 14.01.2015 в 12:24