В чем разница между Bash и Sh?


28

Я вижу два типа используемого кода:

#!/usr/bin/sh

а также:

#!/user/bin/bash

Я искал это онлайн, и мнения сильно различаются. Объяснения, которые я видел на большинстве веб-сайтов, говорят, что shон старше bash, и что нет никакой разницы.

Кто-нибудь знает разницу между этими? Можете ли вы дать мне практический пример, когда использовать один над другим?


для общего обзора различных оболочек (не только shи bash): http://en.wikipedia.org/wiki/Comparison_of_command_shells
akira

1
Еще одна замечательная история здесь: faqs.org/faqs/unix-faq/shell/shell-differences
Джон Райт

Ответы:


34

bashявляется надмножеством shт.е. все, что вы можете сделать, shвы можете сделать в bash.

Bash имеет больше возможностей (ветвление, встроенные функции, массивы), что облегчает написание скрипта. Некоторые более поздние * nix'ы имеют /bin/shссылку на/bin/bash

Для полного объяснения того, что вот учебник


5
@Saif Bechan: Одной из причин того, что оболочка Bourne ( sh) была не просто расширена, является то, что Bash` был написан кем-то другим. Также я уверен, что были проблемы с лицензией. Прочитайте статью о Bourne Shell. En.wikipedia.org/wiki/Bourne_shell
Феликс,

7
Удаление shприведет к поломке множества скриптов, которые ожидают его появления и полагаются на то, как он разбирает вещи. Пользователям Linux может быть все равно, но люди, которые тратят тысячи долларов на Solaris, AIX или HP-UX, могут быть очень раздражены.
Njd

3
... и для еще большего удовольствия, Ubuntu symlinks / bin / sh to dash. Dash не полностью соответствует стандарту sh или bash, но должен запускаться быстрее. Когда система загружается, запускаются все сценарии init.d, и я думаю, что сэкономленное время того стоит.
kbyrd

8
Я почти уверен, что Дэш полностью соответствует стандартам. Проблема в том, что некоторые люди пишут сценарии с именем / bin / sh, но для работы самого сценария требуется / bin / bash. Никто не замечает проблемы, потому что большую часть времени / bin / sh просто указывает на / bin / bash.
Давр

8
@Saif: Есть еще одна причина, по которой shего не просто расширили: его исходный код - настоящий ад. Посмотри. Это должно быть C ...
Гравитация

6

Традиционно, / bin / sh был бы оригинальной оболочкой Bourne, которая не имеет истории или редактирования в командной строке, а также не контролирует работу.

В течение последних 15 лет в большинстве Unix-систем была установлена ​​оболочка POSIX, или, по крайней мере, ksh или bash (которые очень похожи на POSIX-подобные), но все еще имеют более ограниченную оболочку в / bin / sh

Причина в том, что старые сценарии оболочки, которые ожидают, что старая shкоманда все еще будут работать.
Так как персонажи любят {, }и !имеют особое значение для Баша, вполне возможно , что старший сценарий оболочки , используя эти символы (без побега их) может потерпеть неудачу.
(Оболочка Bourne будет восприниматься !!{1,2}буквально, тогда как bash интерпретирует это как повтор предыдущей команды ( !!) с последующим расширением скобки).

В Linux shкоманда почти всегда является ссылкой на bashвсе те же функции.


2
Предполагается, что Bash (но не всегда) ведет себя в режиме sh-совместимости, если вызывается как / bin / sh. Многие вещи сломались, когда Ubuntu переключил / bin / sh с ссылки на / bin / bash на ссылку на / bin / dash. Вещи, которые сломались, предполагали, что они должны были использовать стандартную sh.
Broam

4

sh может означать либо оболочку Bourne, либо / bin / sh, которая является какой-либо другой (POSIX-совместимой) оболочкой на большинстве современных платформ. «Оболочка POSIX» - это абстрактная оболочка, определенная POSIX , которая реализуется с помощью bash в режиме POSIX, или ksh или dash по умолчанию. / bin / sh иногда также называют оболочкой POSIX, потому что это оболочка, которая соответствует POSIX на большинстве платформ. Оригинальные оболочки Bourne не являются оболочками POSIX.

У bashref есть список различий между оболочками bash и Bourne . man bashимеет список изменений, когда bash вызывается в режиме POSIX .

/ bin / sh не является символической ссылкой или жесткой ссылкой в ​​OS X, но он почти такого же размера, как / bin / bash:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

человек Баш :

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

В остальном мимикрирование снарядов Борна довольно ограничено. bash +B(Борн) фактически отключил бы такие функции, как расширение фигурных скобок.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

Но даже если вы отключите режим POSIX, эхо ведет себя как echo -eпо умолчанию:

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / sh - черта в Ubuntu , поэтому некоторые ошибки работают с / bin / sh в OS X, но не в Ubuntu.

Если вы действительно хотите писать сценарии для (что-то вроде) оригинальных оболочек Борна, вы можете использовать #!/usr/bin/env bash +Bвместо этого.

Я думаю, что проще написать сценарии для bash, чем избегать функций, которые не являются частью спецификаций POSIX или оболочек Bourne, или проверять все с помощью других оболочек.


2

На самом деле, даже если / bin / sh может быть ссылкой на / bin / bash, при запуске как sh он ведет себя по-другому. Из справочной страницы bash:

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

Так как shон пытается подражать историческому поведению. Как bash, он пытается быть максимально полезным, как интерактивная оболочка входа в систему.


2

Во многих системах, в частности в Solaris, bash динамически связан, а sh статически связан. Это может представлять угрозу безопасности, поэтому пользователь root должен использовать только / bin / sh в качестве оболочки (если вам когда-либо понадобится войти в систему как root).


2
Также может быть полезно в экстренных случаях, если вы сделали что-то плохое ldconfigили ваш /libкаталог по какой-то причине уничтожен.
LawrenceC
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.