Що ш
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- це дуже мінімалістична мова програмування.