При написании программ оболочки мы часто используем /bin/sh
и /bin/bash
. Я обычно использую bash
, но я не знаю, в чем разница между ними.
Какая основная разница между bash
а sh
?
Что мы должны знать при программировании bash
и sh
?
При написании программ оболочки мы часто используем /bin/sh
и /bin/bash
. Я обычно использую bash
, но я не знаю, в чем разница между ними.
Какая основная разница между bash
а sh
?
Что мы должны знать при программировании bash
и sh
?
Ответы:
sh
(или Shell Command Language) - это язык программирования, описанный стандартом 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
могут даже не существовать):
sh
на которые dash
по умолчанию установлены;initramfs
. Он использует ash
реализацию оболочки.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 поддерживают ее.
В конечном счете, вам решать, какой из них использовать, написав строку «shebang» в качестве самой первой строки сценария.
Например
#!/bin/sh
будет использовать sh
(и все, что происходит, чтобы указать),
#!/bin/bash
будет использовать, /bin/bash
если это доступно (и не с сообщением об ошибке, если это не так). Конечно, вы также можете указать другую реализацию, например,
#!/bin/dash
Для моих собственных сценариев я предпочитаю sh
по следующим причинам:
bash
, они должны иметьsh
Есть и преимущества в использовании bash
. Его особенности делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные и массивы. Plain sh
- очень минималистичный язык программирования.
bash
отображением пути, больше полезных сообщений об ошибках в случае синтаксической ошибки. Вы можете просто сэкономить время, используя bash.
%
означает в начале вашей командной строки?
$
вместо %
или #
для корневой оболочки.
$
и #
...
sh
существовал задолго до bash (что означает «bourne-again shell»). Но это было очень примитивно и не отвечало на терминальные события, как ESC
персонажи. Затем ksh
пришел (также до bash), затем bash начали те, кто любил идею лучшей оболочки, но ненавидел ksh. :-)
sh
: http://man.cx/sh
bash
: http://man.cx/bash
TL; DR : bash
это расширенный набор sh
с более элегантным синтаксисом и большей функциональностью. Безопасно использовать линию bash-shebang почти во всех случаях, поскольку она довольно распространена на современных платформах.
NB: в некоторых средах sh
есть bash
. Проверьте sh --version
.
Этот вопрос часто называют каноническим для людей, которые пытаются использовать его sh
и удивляются, что он не ведет себя так же, как bash
. Вот краткое изложение распространенных недоразумений и подводных камней.
Прежде всего, вы должны понимать, чего ожидать.
sh scriptname
, или запустить его с scriptname
и иметь #!/bin/sh
в хижину линии, вы должны ожидать POSIXsh
поведения.bash scriptname
или запускаете его scriptname
и имеете #!/bin/bash
(или локальный эквивалент) в строке shebang, вам следует ожидать поведения Bash.Как правило, предпочтительным решением является наличие правильного shebang и запуск сценария путем ввода только имени сценария (возможно, с относительным или полным путем ). В дополнение к правильному shebang, для этого требуется, чтобы файл сценария имел разрешение на выполнение ( chmod a+x scriptname
).
Итак, как они на самом деле отличаются?
Справочное руководство Bash содержит раздел, в котором делается попытка перечислить различия, но некоторые распространенные источники путаницы включают
[[
недоступен в sh
(только [
более неуклюжий и ограниченный).sh
не имеет массивов.local
, source
, function
, shopt
, let
, declare
, и select
не портативный sh
. (Некоторые sh
реализации поддерживают, например local
.)for((i=0;i<=3;i++))
цикл с тремя аргументами , +=
присваивание инкремента и т. Д. Эта $'string\nwith\tC\aescapes'
функция предварительно принята для POSIX (это означает, что она работает в Bash сейчас, но пока не будет поддерживаться sh
в системах, которые придерживаются только текущего Спецификация POSIX, и, вероятно, не будет в течение некоторого времени, чтобы прийти).<<<'here strings'
.*.{png,jpg}
и {0..12}
скобка расширения.~
относится $HOME
только к Bash (и в целом~username
к домашнему каталогу username
)./bin/sh
.<(cmd)
и >(cmd)
.&|
для удобного перенаправления в стиле Csh, например, для 2>&1 |
и &>
для> ... 2>&1
<>
перенаправлением.${substring:1:2}
,${variable/pattern/replacement}
преобразование регистра и т. Д.$[expression]
синтаксис, который, однако, должен быть заменен арифметическим $((expression))
синтаксисом POSIX . (Некоторое наследие pre-POSIXsh
могут не поддерживать это.)$RANDOM
, $SECONDS
, $PIPESTATUS[@]
и $FUNCNAME
являются расширениями Bash.export variable=value
и [ "x" == "y" ]
которые не являются переносимыми ( export variable
должны быть отделены от назначения переменных, а переносимое сравнение строк [ ... ]
использует один знак равенства).Помните, это сокращенный список. Обратитесь к справочному руководству для полного совка и http://mywiki.wooledge.org/Bashism для многих хороших обходных путей; и / или попробуйте http://shellcheck.net/ который предупреждает о многих функциях только для Bash.
Распространенной ошибкой является наличие #!/bin/bash
строки Шебанга, но, тем не менее, использование sh scriptname
для фактического запуска скрипта. Это в основном отключает любые функции Bash-only, поэтому вы получаете синтаксические ошибки, например, при попытке использовать массивы. (Строка shebang является синтаксически комментарием, поэтому в этом сценарии она просто игнорируется.)
К сожалению, Bash не будет предупреждать, когда вы пытаетесь использовать эти конструкции, когда он вызывается как sh
. Он также не полностью отключает все функции Bash-only, поэтому запуск Bash, вызвав его, sh
не является хорошим способом проверить, является ли ваш скрипт правильно переносимым на ash
/ dash
/ POSIX sh
или варианты, такие как Heirloomsh
export variable=value
поручено POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Возможно, это недоступно в некоторых древних оболочках, но это определенно не башизм.
Shell - это интерфейс между пользователем и ОС для доступа к сервисам операционной системы. Это может быть GUI или CLI (интерфейс командной строки).
sh (Bourne sh ell) - интерпретатор командной строки оболочки для Unix / Unix-подобных операционных систем. Он предоставляет некоторые встроенные команды. В скриптовом языке мы обозначаем переводчик как #!/bin/sh
. Это была наиболее широко поддерживаемая оболочка, такая как bash (free / open), kash (не free).
Bash ( Б ourne GAIN сек ад) является заменой оболочки для Bourne оболочки. Bash - это суперсет sh. Баш поддерживает ш. POSIX - это набор стандартов, определяющих, как должны работать POSIX-совместимые системы. Bash на самом деле не является POSIX-совместимой оболочкой. На языке сценариев мы обозначаем переводчика как .#!/bin/bash
Аналогия:
sh
(так что это «подкласс» в смысле ООП) и расширяет его (как и расширенный набор функций).
Пост из UNIX.COM
Особенности оболочки
В приведенной ниже таблице перечислены большинство функций, которые, я думаю, заставят вас выбрать одну оболочку над другой. Он не предназначен для того, чтобы быть окончательным списком и не включает в себя все возможные функции для каждой возможной оболочки. Считается, что компонент находится в оболочке, только если он находится в версии, поставляемой с операционной системой, или если он доступен как скомпилированный непосредственно из стандартного дистрибутива. В частности, оболочка C, указанная ниже, доступна в SUNOS 4. *, значительное количество поставщиков теперь поставляют либо tcsh, либо свои собственные улучшенные оболочки C (они не всегда дают понять, что поставляют tcsh.
Код:
sh csh ksh bash tcsh zsh rc es
Job control N Y Y Y Y Y N N
Aliases N Y Y Y Y Y N N
Shell functions Y(1) N Y Y N Y Y Y
"Sensible" Input/Output redirection Y N Y Y N Y Y Y
Directory stack N Y Y Y Y Y F F
Command history N Y Y Y Y Y L L
Command line editing N N Y Y Y Y L L
Vi Command line editing N N Y Y Y(3) Y L L
Emacs Command line editing N N Y Y Y Y L L
Rebindable Command line editing N N N Y Y Y L L
User name look up N Y Y Y Y Y L L
Login/Logout watching N N N N Y Y F F
Filename completion N Y(1) Y Y Y Y L L
Username completion N Y(2) Y Y Y Y L L
Hostname completion N Y(2) Y Y Y Y L L
History completion N N N Y Y Y L L
Fully programmable Completion N N N N Y Y N N
Mh Mailbox completion N N N N(4) N(6) N(6) N N
Co Processes N N Y N N Y N N
Builtin artithmetic evaluation N Y Y Y Y Y N N
Can follow symbolic links invisibly N N Y Y Y Y N N
Periodic command execution N N N N Y Y N N
Custom Prompt (easily) N N Y Y Y Y Y Y
Sun Keyboard Hack N N N N N Y N N
Spelling Correction N N N N Y Y N N
Process Substitution N N N Y(2) N Y Y Y
Underlying Syntax sh csh sh sh csh sh rc rc
Freely Available N N N(5) Y Y Y Y Y
Checks Mailbox N Y Y Y Y Y F F
Tty Sanity Checking N N N N Y Y N N
Can cope with large argument lists Y N Y Y Y Y Y Y
Has non-interactive startup file N Y Y(7) Y(7) Y Y N N
Has non-login startup file N Y Y(7) Y Y Y N N
Can avoid user startup files N Y N Y N Y Y Y
Can specify startup file N N Y Y N N N N
Low level command redefinition N N N N N N N Y
Has anonymous functions N N N N N N Y Y
List Variables N Y Y N Y Y Y Y
Full signal trap handling Y N Y Y N Y Y Y
File no clobber ability N Y Y Y Y Y N F
Local variables N N Y Y N Y Y Y
Lexically scoped variables N N N N N N N Y
Exceptions N N N N N N N Y
Ключ к таблице выше.
Y Функция может быть выполнена с помощью этой оболочки.
N Функция отсутствует в оболочке.
F Функция может быть реализована только с использованием механизма функции оболочки.
L Библиотека readline должна быть связана с оболочкой, чтобы включить эту функцию.
Примечания к таблице выше
1. This feature was not in the original version, but has since become
almost standard.
2. This feature is fairly new and so is often not found on many
versions of the shell, it is gradually making its way into
standard distribution.
3. The Vi emulation of this shell is thought by many to be
incomplete.
4. This feature is not standard but unofficial patches exist to
perform this.
5. A version called 'pdksh' is freely available, but does not have
the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.
ТЕРМИНАЛ
РАКУШКА
SH Vs. BASH
SH
BASH
СПРАВОЧНЫЙ МАТЕРИАЛ:
SHELL gnu.org:
В своей основе оболочка - это просто макропроцессор, который выполняет команды. Термин « макропроцессор» означает функциональность, в которой текст и символы расширяются для создания больших выражений.
Оболочка Unix является и интерпретатором команд, и языком программирования. В качестве интерпретатора команд оболочка предоставляет пользовательский интерфейс для богатого набора утилит GNU. Особенности языка программирования позволяют комбинировать эти утилиты. Файлы, содержащие команды, могут быть созданы и сами становятся командами. Эти новые команды имеют тот же статус, что и системные команды в каталогах, таких как / bin, что позволяет пользователям или группам создавать пользовательские среды для автоматизации их общих задач.
Оболочки могут использоваться в интерактивном или неинтерактивном режиме. В интерактивном режиме они принимают ввод, введенный с клавиатуры. При неинтерактивном выполнении командные оболочки выполняют команды чтения из файла.
Оболочка позволяет выполнять команды GNU как синхронно, так и асинхронно. Оболочка ожидает завершения синхронных команд, прежде чем принимать больше ввода; Асинхронные команды продолжают выполняться параллельно с оболочкой, пока она читает и выполняет дополнительные команды. Конструкции перенаправления позволяют детально контролировать ввод и вывод этих команд. Кроме того, оболочка позволяет контролировать содержимое командных сред.
Оболочки также предоставляют небольшой набор встроенных команд (встроенных функций), реализующих функциональные возможности, которые невозможно или неудобно получить с помощью отдельных утилит . Например, cd, break, continue и exec не могут быть реализованы вне оболочки, потому что они напрямую манипулируют самой оболочкой. Встроенные функции history, getopts, kill или pwd, среди прочего, могут быть реализованы в отдельных утилитах, но их удобнее использовать в качестве встроенных команд. Все встроенные функции оболочки описаны в последующих разделах.
Хотя выполнение команд необходимо, большая часть мощности (и сложности) оболочек обусловлена их встроенными языками программирования. Как и любой язык высокого уровня, оболочка предоставляет переменные, конструкции управления потоком, цитирование и функции.
Оболочки предлагают функции, предназначенные специально для интерактивного использования, а не для расширения языка программирования. Эти интерактивные функции включают управление заданиями, редактирование командной строки, историю команд и псевдонимы. Каждая из этих функций описана в данном руководстве.
BASH gnu.org:
Bash - это оболочка или интерпретатор командного языка для операционной системы GNU. Название является аббревиатурой от «Bourne-Again SHell», каламбура на Стивена Борна, автора прямого предка текущей оболочки Unix sh, которая появилась в седьмом издании Bell Labs Research версии Unix.
Bash в значительной степени совместим с sh и включает полезные функции из оболочки Korn ksh и оболочки C csh. Предполагается, что это будет совместимая реализация части IEEE POSIX Shell and Tools спецификации IEEE POSIX (стандарт IEEE 1003.1). Он предлагает функциональные улучшения по сравнению с sh для интерактивного использования и программирования.
В то время как операционная система GNU предоставляет другие оболочки, включая версию csh, Bash является оболочкой по умолчанию . Как и другое программное обеспечение GNU, Bash довольно переносим. В настоящее время он работает практически на всех версиях Unix и некоторых других операционных системах - независимо поддерживаемые порты существуют для платформ MS-DOS, OS / 2 и Windows.
Другие ответы обычно указывают на разницу между Bash и стандартом оболочки POSIX. Однако при написании переносимых сценариев оболочки и использовании их в синтаксисе Bash список типичных bashisms и соответствующих чистых решений POSIX очень удобен. Такой список был скомпилирован, когда Ubuntu переключился с Bash на Dash в качестве системной оболочки по умолчанию, и его можно найти здесь: https://wiki.ubuntu.com/DashAsBinSh
Кроме того, есть отличный инструмент, называемый checkbashisms, который проверяет наличие bashisms в вашем скрипте и оказывается полезным, когда вы хотите убедиться, что ваш скрипт переносим.
Они почти идентичны, но bash
имеют больше функций - sh
это (более или менее) старое подмножество bash
.
sh
часто означает оригинал Bourne shell
, который предшествовал bash
( Bourne *again* shell
) и был создан в 1977 году. Но на практике может быть лучше думать о нем как о кросс-совместимой оболочке, соответствующей стандарту POSIX 1992 года.
Скрипты, которые начинаются с оболочки #!/bin/sh
или используют ее, sh
обычно делают это для обратной совместимости. Любая ОС Unix / Linux будет иметь sh
оболочку. На Ubuntu sh
часто вызывает, dash
а на MacOS это специальная версия POSIX bash
. Эти оболочки могут быть предпочтительными для соответствия стандарту поведения, скорости или обратной совместимости.
bash
новее оригинала sh
, добавляет больше возможностей и стремится к обратной совместимости с sh
. Теоретически sh
программы должны работать bash
. bash
доступно почти на всех машинах linux / unix и обычно используется по умолчанию - за заметным исключением MacOS по умолчанию с zsh
Catalina (10.15). FreeBSD по умолчанию не поставляется с bash
установленным.
sh
далеко предшествует POSIX. В наши дни вы надеетесь, что все, что sh
вы найдете, по крайней мере POSIX-совместимо; но в устаревших системах это ни в коем случае не является данностью. POSIX ставит гораздо больше, чем оболочка; на самом деле можно утверждать, что стандартизация вызовов операционной системы и библиотечных функций важнее.
/bin/sh
может или не может вызывать ту же программу, что и /bin/bash
.
sh
поддерживает, по крайней мере, функции, необходимые для POSIX (при условии правильной реализации). Он также может поддерживать расширения.
bash
«Bourne Again Shell» реализует функции, необходимые для расширений sh плюс bash. Полный набор расширений слишком длинный, чтобы описывать его здесь, и он меняется в зависимости от новых выпусков. Различия описаны в руководстве по bash. Введите info bash
и прочитайте раздел «Возможности Bash» (раздел 6 в текущей версии) или прочитайте текущую документацию онлайн .
sh
только дает вам оболочку POSIX, если у вас есть права, PATH
установленные в вашей текущей оболочке. Не существует определенного PATH-имени, которое дает вам оболочку POSIX.
sh
не обязательно было даже предоставление вам оболочки POSIX, например, на Solaris.
Баш и Ш - это две разные оболочки. В основном bash это sh, с большим количеством функций и лучшим синтаксисом. Большинство команд работают одинаково, но они разные. Bash (bash) - одна из многих доступных (но наиболее часто используемых) оболочек Unix. Bash означает «Bourne Again SHell» и является заменой / улучшением оригинальной оболочки Bourne (sh).
Сценарии оболочки - это сценарии в любой оболочке, тогда как сценарии Bash - сценарии специально для Bash. На практике, однако, «сценарий оболочки» и «сценарий bash» часто используются взаимозаменяемо, если речь не идет о Bash.
Сказав это, вы должны понимать, что / bin / sh на большинстве систем будет символической ссылкой и не будет вызывать sh. В Ubuntu / bin / sh используется для ссылки на bash, типичное поведение в дистрибутивах Linux, но теперь изменилось на соединение с другой оболочкой, называемой dash. Я бы использовал bash, поскольку это в значительной степени стандарт (или, по крайней мере, наиболее распространенный, из моего опыта). Фактически, проблемы возникают, когда сценарий bash будет использовать #! / Bin / sh, потому что создатель сценария предполагает, что ссылка должна быть bash, когда это не обязательно.
Различия настолько просты, насколько это возможно: после того, как вы поймете основы, другие комментарии, опубликованные выше, будет легче уловить.
Оболочка - «Shell» - это программа, которая облегчает взаимодействие пользователя и операционной системы (ядра). Доступно множество реализаций оболочки, таких как sh, bash, csh, zsh ... и т. Д.
Используя любую из программ оболочки, мы сможем выполнять команды, которые поддерживаются этой программой оболочки.
Bash - Это происходит от B ourne- в усиления Ш. ELL. Используя эту программу, мы сможем выполнить все команды, указанные Shell. Также мы сможем выполнить некоторые команды, специально добавленные в эту программу. Bash имеет обратную совместимость с sh.
Sh - это получено из Bourne Sh флигель. «sh» поддерживает все команды, указанные в оболочке. Значит, используя эту программу, мы сможем выполнить все команды, указанные Shell.
Для получения дополнительной информации: - https://man.cx/sh - https://man.cx/bash
Операционная система Linux предлагает различные типы оболочек. Хотя оболочки имеют много общих команд, у каждого типа есть свои особенности. Давайте изучим различные виды наиболее часто используемых снарядов.
Sh shell:
Sh shell также известен как Bourne Shell. Оболочка Sh - первая оболочка, разработанная для компьютеров Unix Стивеном Борном (Stephen Bourne) в Bell Labs компании AT & T в 1977 году. Она включает в себя множество инструментов для написания сценариев.
Bash shell:
Bash shell означает Bourne Again Shell. Оболочка Bash является оболочкой по умолчанию в большинстве дистрибутивов Linux и заменяет Sh Shell (оболочка Sh также запускается в оболочке Bash). Bash Shell может выполнять подавляющее большинство сценариев оболочки Sh без модификации, а также предоставляет возможность редактирования командной строки.