Що ш
sh
(або Мова командної оболонки) - мова програмування, описана стандартом POSIX . Вона має безліч реалізацій ( ksh88
, dash
, ...). bash
також можна вважати реалізацією sh
(див. нижче).
Оскільки sh
специфікація, а не реалізація /bin/sh
- це симпосилання (або жорстке посилання) до фактичної реалізації в більшості систем POSIX.
Що таке баш
bash
розпочався як sh
сумісна реалізація (хоча вона передувала стандарту POSIX протягом кількох років), але з часом вона набула багатьох розширень. Багато з цих розширень можуть змінити поведінку дійсних сценаріїв оболонки POSIX, тому само по собі bash
не є дійсною оболонкою POSIX. Скоріше, це діалект мови оболонки POSIX.
bash
підтримує --posix
комутатор, що робить його більш сумісним з POSIX. Він також намагається імітувати POSIX, якщо його викликають як sh
.
ш = баш?
Тривалий час /bin/sh
використовується для вказівки /bin/bash
на більшість систем GNU / Linux. В результаті цього майже стало безпечно ігнорувати різницю між ними. Але це почало змінюватися нещодавно.
Деякі популярні приклади систем /bin/sh
, на які не вказується /bin/bash
(а на деяких з яких /bin/bash
може навіть не існувати), є:
- Сучасні системи Debian і Ubuntu, які за замовчуванням посилаються
sh
на посилання dash
;
- Busybox , який зазвичай запускається під час завантаження системи Linux як частина
initramfs
. Він використовує реалізацію ash
оболонки.
- BSD і взагалі будь-які нелінукс-системи. Використовує OpenBSD
pdksh
, нащадок оболонки Корна. FreeBSD sh
є нащадком оригінальної оболонки UNIX Bourne. Solaris має власну, sh
яка довгий час не відповідала POSIX; безкоштовна реалізація доступна від проекту Heirloom .
Як ви можете дізнатися, на що /bin/sh
вказує ваша система?
Ускладнення полягає в тому, що це /bin/sh
може бути символічним або жорстким зв’язком. Якщо це символічне посилання, портативний спосіб вирішити це:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Якщо це міцне посилання, спробуйте
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
Насправді -L
прапор охоплює як посилання, так і жорсткі посилання, але недоліком цього методу є те, що він не є портативним - POSIX не потребує find
підтримки -samefile
опції, хоча і GNU find, і FreeBSD знаходять підтримку.
Лінія Шебанг
Зрештою, вирішувати, який саме використовувати, вирішувати, написавши рядок «shebang».
Напр
#!/bin/sh
буде використовувати sh
(і що б там не сталося),
#!/bin/bash
буде використовуватись, /bin/bash
якщо вона доступна (і не вдасться зі повідомленням про помилку, якщо її немає). Звичайно, ви можете також вказати іншу реалізацію, наприклад
#!/bin/dash
Який використовувати
Для власних сценаріїв я віддаю перевагу sh
з наступних причин:
- вона стандартизована
- набагато простіше і простіше вчитись
- він портативний у системах POSIX - навіть якщо вони трапляються
bash
, їх не потрібно матиsh
Є і переваги використання bash
. Його особливості роблять програмування більш зручним і схожим з програмуванням в інших сучасних мовах програмування. Сюди входять такі речі, як масштабовані локальні змінні та масиви. Plain sh
- це дуже мінімалістична мова програмування.