Что такое ш
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- очень минималистичный язык программирования.