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

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

#!/bin/bash
echo "foo"

или же

#!/bin/sh
echo "foo"

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

4 ответа

Решение

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

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

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

В 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, чтобы иметь возможность работать при указании на dash.

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

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

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

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

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

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

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

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

 exec  > >(tee logfile.txt)

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

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

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