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


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

#!/bin/bash
echo "foo"

или

#!/bin/sh
echo "foo"

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


211
2018-05-25 03:59


происхождения




ответы:


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,


178
2018-05-25 04:08



Ваш первый абзац довольно вводит в заблуждение. «sh» - это вовсе не оболочка, а символическая ссылка на текущую конфигурацию системная оболочка, который на Linux-системах обычно либо bash, либо тире (последние версии Ubuntu с использованием последних). - thomasrutter
/bin/sh используется как оболочка, называемая раковина борна еще в 1977 году. bash - совместимая оболочка / bin / sh, которая Можно быть использованным в качестве замены раковины bourne, которая соответствует posix. en.wikipedia.org/wiki/Bourne_shell - Alex
удар является де-факто стандартом (очень широко используется), но он не является «стандартным»; ш на Ubuntu использует тир, которая является совместимой с Posix оболочкой, поэтому она действительно стандартная. Мой совет - использовать тир как можно чаще для сценариев, особенно для серверных сценариев. Несмотря на то что ударболее выразительна, тир работает намного быстрее и безопаснее. - Rick-777
@ Rick-777. Должен ли я явно помещать #! / Bin / dash в начало моих скриптов? Я также написал сценарии, где я пишу только команды и выполняю с ./scriptName, и это отлично работает. Требуется ли #! / Bin / yourShellHere? - user137717
@ Rick-777 В случаях, когда я исключаю любое #! / Bin / shellName, я назвал файлы fileName.sh. Будет ли это неявно ссылаться на предпочтительную системную оболочку без объявления #! / Bin / sh? - user137717


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

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

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

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

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

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

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

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

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

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

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

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

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


62
2018-05-25 08:31





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

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

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

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

 exec  > >(tee logfile.txt)

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


15
2018-01-14 11:24