Что такое ш
sh
(или Shell Command Language) - это язык программирования, описанный стандартом POSIX . Она имеет множество реализаций ( ksh88
, dash
, ...). bash
также может рассматриваться как реализация sh
(см. ниже).
Потому sh
что это спецификация, а не реализация, /bin/sh
это символическая ссылка (или жесткая ссылка) на фактическую реализацию в большинстве систем POSIX.
Что такое bash
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 и вообще любые не-Linux системы. OpenBSD использует
pdksh
, потомок оболочки Korn. 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 find поддерживают ее.
Линия Шебанг
В конечном счете, вам решать, какой из них использовать, написав строку «шебанг».
Например
#!/bin/sh
будет использовать sh
(и все, что происходит, чтобы указать),
#!/bin/bash
будет использовать, /bin/bash
если это доступно (и не с сообщением об ошибке, если это не так). Конечно, вы также можете указать другую реализацию, например,
#!/bin/dash
Какой использовать
Для моих собственных сценариев я предпочитаю sh
по следующим причинам:
- это стандартизировано
- это намного проще и легче учиться
- он переносим через системы POSIX - даже если они не имеют
bash
, они должны иметьsh
Есть и преимущества в использовании bash
. Его особенности делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные и массивы. Plain sh
- очень минималистичный язык программирования.