Яка різниця між bash і sh?


28

Я бачу два типи коду:

#!/usr/bin/sh

і:

#!/user/bin/bash

Я шукав це в Інтернеті, і думки дуже різняться. У поясненнях, які я бачив на більшості веб-сайтів, йдеться про те, що shце старше bash, і немає реальної різниці.

Хтось знає різницю між цими? Чи можете ви надати мені практичний приклад, коли користуватися одним над іншим?


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

1
Ще одна велика історія тут: faqs.org/faqs/unix-faq/shell/shell-differences
Джон Райт

Відповіді:


34

bashє надмножеством shтобто. все, що ви можете зробити, shви можете зробити в bash.

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

Для повного пояснення того, що тут підручник


5
@Saif Bechan: Однією з причин того, що оболонку Борна ( sh) не було просто розширено, є те, що Bash` написав хтось інший. Крім того, я думаю, що були проблеми з ліцензією. Прочитайте статтю про Bourne Shell en.wikipedia.org/wiki/Bourne_shell
Фелікс

7
Видалення shпризведе до порушення багатьох сценаріїв, які очікують, що він буде там, і покладаються на те, як він розбирає речі. Користувачі Linux можуть не хвилюватися, але люди, витрачаючи тисячі доларів на Solaris, AIX або HP-UX, можуть бути дуже роздратовані.
njd

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

8
Я майже впевнений, що Dash повністю відповідає стандартам. Проблема полягає в тому, що деякі люди пишуть сценарії, які говорять / bin / sh, але сам сценарій вимагає / bin / bash для роботи. Ніхто не помічає проблеми, оскільки більшість часу / bin / sh просто вказує на / bin / bash.
davr

8
@Saif: Є ще одна причина, чому shїї не просто розширили: її вихідний код - це чисте пекло. Поглянь. Це повинно бути C ...
grawity

6

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

Приблизно протягом останніх 15 років або більше, більшість Unixes встановили оболонку POSIX або принаймні ksh або bash (які майже схожі на POSIX), але все ще мають більш обмежену оболонку в / bin / sh

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

У Linux, однак, shкоманда майже завжди є лише посиланням на bash, з усіма тими ж можливостями.


2
Баш повинен (але не завжди) поводитися в режимі сумісності sh, якщо його викликають як / bin / sh. Багато речей вирвалося, коли Ubuntu переключився / bin / sh із переходу на / bin / bash до посилання на / bin / dash. Речі, які ламали, припускали башизми, коли вони повинні були використовувати стандартні ш.
Брам

4

sh може означати оболонку Bourne або / bin / sh, яка є деякою іншою оболонкою (сумісною з POSIX) на більшості сучасних платформ. "Оболонка POSIX" - це абстрактна оболонка, визначена POSIX , яка реалізована bash в режимі POSIX, або ksh або тире за замовчуванням. / bin / sh іноді також називають оболонкою POSIX, оскільки це оболонка, яка відповідає POSIX на більшості платформ. Оригінальні снаряди Борна не є оболонками 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

man bash :

Якщо bash викликається ім'ям sh, він намагається максимально наблизити поведінку до запуску історичних версій sh, дотримуючись стандарт POSIX.

Інакше наслідування снарядів Борна інакше досить обмежене. bash +B(Bourne) фактично відключить такі функції, як розширення дужок.

$ 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 викликається ім'ям 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.