Что такое sh
sh
(или язык команд оболочки) - это язык программирования, описываемый стандартом POSIX .Он имеет много реализаций (ksh88
, dash
, ...).bash
также можно считать реализацией sh
(см. Ниже).
Поскольку sh
является спецификацией, а не реализацией, /bin/sh
является символической ссылкой (или жесткой ссылкой) нафактическая реализация в большинстве систем POSIX.
Что такое bash
bash
, начатая как sh
-совместимая реализация (хотя она предшествует стандарту POSIX на несколько лет), но со временемпрошло это приобрело много расширений.Многие из этих расширений могут изменить поведение допустимых сценариев оболочки POSIX, поэтому само по себе bash
не является допустимой оболочкой POSIX.Скорее, это диалект языка оболочки POSIX.
bash
поддерживает переключатель --posix
, что делает его более совместимым с POSIX.Он также пытается имитировать POSIX, если вызывается как sh
.
sh = bash?
В течение длительного времени /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-совместимым;бесплатная реализация доступна из проекта Семейная реликвия .
Как узнать, на что указывает /bin/sh
в вашей системе?
Сложность состоит в том, что/bin/sh
может быть символической ссылкой или жесткой ссылкой.Если это символическая ссылка, portable способ ее разрешения:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Если это жесткая ссылка, попробуйте
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
На самом деле, *Флаг 1070 * охватывает как символические, так и жесткие ссылки, но недостатком этого метода является то, что он не переносим - POSIX не требует find
для поддержки опции -samefile
, хотя оба GNU find и FreeBSD находят его поддерживают.
Линия Шебанга
В конечном счете, вы сами решаете, какой из них использовать, написав строку «Шебанг».
Например,
#!/bin/sh
будет использовать sh
(и на что бы это ни указывало),
#!/bin/bash
будет использовать /bin/bash
, если оно доступно (иошибка с сообщением об ошибке, если это не так).Конечно, вы также можете указать другую реализацию, например,
#!/bin/dash
Какую использовать
Для своих собственных сценариев я предпочитаю sh
по следующим причинам:
- он стандартизирован
- его намного проще и легче выучить
- он переносим через системы POSIX - даже если у него нет
bash
, он должен иметьsh
Есть и преимущества использования bash
.Его особенности делают программирование более удобным и похожим на программирование на других современных языках программирования.К ним относятся такие вещи, как локальные переменные и массивы.Обычный sh
- очень минималистичный язык программирования.