Разница между sh и bash

При написании программ оболочки мы часто используем /bin/sh и /bin/bash. Обычно я использую bash, но я не знаю, какая разница между ними.

Какое основное различие между bash и sh?

Что нам нужно знать при программировании в bash и sh?

Ответ 1

Что такое 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; свободная реализация доступна из проекта 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. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие области, как локальные переменные и массивы. Обычный sh - очень минималистический язык программирования.

Ответ 2

sh: http://man.cx/sh
bash: http://man.cx/bash

TL; DR: bash - это надмножество sh с более элегантным синтаксисом и большей функциональностью. Безопасно использовать линию bash shebang почти во всех случаях, поскольку она довольно распространена на современных платформах.

NB: в некоторых средах sh is bash. Проверьте sh --version.

Ответ 3

Этот вопрос часто называют каноническим для людей, которые пытаются использовать sh и удивляются, что он не ведет себя так же, как bash. Вот краткое изложение распространенных недоразумений и подводных камней.

Прежде всего, вы должны понимать, чего ожидать.

  • Если вы запускаете свой сценарий с sh scriptname или с scriptname и имеете #!/bin/sh в строке shebang, вам следует ожидать поведения POSIX sh.
  • Если вы запускаете свой сценарий с bash scriptname или с помощью scriptname и имеете #!/bin/bash (или локальный эквивалент) в строке shebang, вам следует ожидать поведения Bash.

Как правило, предпочтительным решением является наличие правильного shebang и запуск сценария путем ввода только имени сценария (возможно, с относительным или полным путем). В дополнение к правильному shebang, для этого требуется, чтобы файл сценария имел разрешение на выполнение (chmod a+x scriptname).

Итак, чем они на самом деле отличаются?

Справочное руководство по Bash содержит раздел , в котором предпринята попытка перечислить различия, но некоторые распространенные источники путаницы включают

  • [[ недоступен в sh (только [, который более неуклюж и ограничен).
  • sh не имеет массивов.
  • Некоторые ключевые слова Bash, такие как local, source, function, shopt, let, declare и select, не являются переносимыми для sh. (Некоторые реализации sh поддерживают, например, local.)
  • Bash имеет много синтаксических расширений в стиле C, таких как цикл for((i=0;i<=3;i++)) с тремя аргументами, присваивание инкремента += и т.д. Функция $'string\nwith\tC\aescapes' ориентировочно принята для POSIX, но пока не поддерживается в системах которые придерживаются только текущей спецификации POSIX.
  • Bash поддерживает <<<'here strings'.
  • У Bash есть расширение *.{png,jpg} и {0..12}.
  • ~ относится к $HOME только в Bash (и, в более общем случае, ~username - к домашнему каталогу username). Это в POSIX, но может отсутствовать в некоторых реализациях pre-POSIX /bin/sh.
  • Bash имеет процесс замены с <(cmd) и >(cmd).
  • Bash имеет псевдонимы для удобного перенаправления в стиле Csh, такие как &| для 2>&1 | и &> для > ... 2>&1
  • Bash поддерживает сопроцессы с перенаправлением <>.
  • Bash предлагает широкий набор расширений нестандартных параметров, таких как ${substring:1:2}, ${variable/pattern/replacement}, преобразование регистра и т.д.
  • Bash значительно расширил возможности арифметики оболочки (хотя все еще не поддерживает плавающую точку). Существует устаревший синтаксис $[expression], который, однако, должен быть заменен арифметическим синтаксисом POSIX $((expression)). (Однако некоторые устаревшие реализации до POSIX sh могут не поддерживать это.)
  • Магические переменные, такие как $RANDOM, $SECONDS, $PIPESTATUS[@] и $FUNCNAME, являются расширениями Bash.
  • Синтаксические различия, такие как export variable=value и [ "x" == "y" ], которые не являются переносимыми (export variable должны быть отделены от присвоения переменной, а для сравнения переносимых строк в [ ... ] используется один знак равенства).
  • Множество расширений Bash-only для включения или отключения необязательного поведения и раскрытия внутреннего состояния оболочки.
  • Много, много удобных функций для интерактивного использования, которые, однако, не влияют на поведение скрипта.

Помните, это сокращенный список. Обратитесь к справочному руководству для полного совка, и 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 или варианты, такие как Фамильная реликвия sh

Ответ 4

Сообщение из 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 Функция может быть выполнена только с помощью функции shells         механизм.

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.

Ответ 5

Shell - это интерфейс между пользователем и ОС для доступа к сервисам операционной системы. Это может быть GUI или CLI (интерфейс командной строки).

sh (Bourne sh ell) - интерпретатор командной строки оболочки для Unix/Unix-подобных операционных систем. Он предоставляет некоторые встроенные команды. В скриптовом языке мы обозначаем интерпретатор как #!/bin/sh. Это была наиболее широко поддерживаемая оболочка, такая как bash (free/open), kash (не free).

Баш ourne ад коэффициент усиления S) является заменой оболочки для оболочки Bourne. Bash это суперсет sh. Баш поддерживает ш. POSIX - это набор стандартов, определяющих, как должны работать POSIX-совместимые системы. Bash на самом деле не является POSIX-совместимой оболочкой. На языке сценариев мы обозначаем интерпретатор как #!/bin/bash.

Аналогия:

  • Оболочка похожа на интерфейс или спецификации или API.
  • sh это класс, который реализует интерфейс Shell.
  • Bash является подклассом sh.

enter image description here

Ответ 6

ТЕРМИНАЛ

  • программа (ы), которая помещает окно вверх
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm и eterm.

SHELL

  • Это программа, которая работает в терминале
  • Shell - это командный интерпретатор и язык программирования
  • Shell - это просто макропроцессор, который выполняет команды.
  • Макропроцессор означает функциональность, где текст и символы расширены, чтобы создавать более крупные выражения.

SH Vs. BASH

SH

  • (SHELL)
  • Является конкретной оболочкой
  • командный интерпретатор и язык программирования
  • Предшественник BASH

BASH

  • (Bourne-Again SHell)
  • Является конкретной оболочкой
  • командный интерпретатор и язык программирования
  • Функции и многое другое
  • Преемник SH
  • BASH - это SHELL по умолчанию

СПРАВОЧНЫЙ МАТЕРИАЛ:

SHELL gnu.org:

В своей базе оболочка - это просто макропроцессор, который выполняет команды. Термин макропроцессор означает функциональность, где текст и символы расширены, чтобы создавать более крупные выражения.

Оболочка Unix - это командный интерпретатор и язык программирования.В качестве интерпретатора команд оболочка предоставляет пользовательский интерфейс для богатый набор утилит GNU. Возможности языка программирования позволяют эти утилиты должны быть объединены. Файлы, содержащие команды, могут быть создаются и становятся самими командами. Эти новые команды имеют тот же статус, что и системные команды в каталогах, таких как /bin, что позволяет пользователей или групп для создания настраиваемых сред для автоматизации их общие задачи.

Оболочки могут использоваться интерактивно или не интерактивно. В интерактивном режиме, они принимают ввод, введенный с клавиатуры. При выполнении неинтерактивно, оболочки выполняют команды, считанные из файла.

Оболочка позволяет выполнять команды GNU, как синхронно, так и асинхронно. Оболочка ожидает выполнения синхронных команд прежде чем принимать больше информации; асинхронные команды продолжают выполняться параллельно с оболочкой, пока он читает и выполняет дополнительные команды. Конструкции перенаправления позволяют осуществлять мелкозернистый контроль ввод и вывод этих команд. Кроме того, оболочка позволяет контроль над содержимым среды команд.

Корпуса также предоставляют небольшой набор встроенных команд (встроенных) невозможность или неудобство отдельные утилиты. Например, cd, break, continue и exec не могут быть реализованы вне оболочки, потому что они непосредственно манипулируют сама оболочка. Истории, getopts, kill или pwd builtins, среди другие, могут быть реализованы в отдельных утилит, но они больше удобно использовать в качестве встроенных команд. Все встроенные оболочки описанных в последующих разделах.

При выполнении команд важно, большая часть мощности (и сложность) оболочек обусловлена ​​их встроенными языками программирования.Как и любой язык высокого уровня, оболочка предоставляет переменные, поток конструкциями управления, цитированием и функциями.

Корпуса предлагают функции, специально предназначенные для чем увеличить язык программирования. Эти интерактивные функции включить управление заданиями, редактирование командной строки, историю команд и псевдонимы. Каждая из этих функций описана в этом руководстве.

BASH gnu.org:

BASH - интерпретатор языка командной строки или интерпретатор команд для GNU операционная система. Название является аббревиатурой для "Bourne-Again SHell", каламбура Стивена Борна, автора прямого предка текущая оболочка Unix sh, появившаяся в Bell Labs седьмого издания Исследовательская версия Unix.

BASH в значительной степени совместим с sh и включает полезные функции из оболочки Korn ksh и C-оболочки csh. Он предназначен для Соответствующая реализация части IEEE POSIX Shell и инструментов спецификация IEEE POSIX (стандарт IEEE 1003.1). Это предлагает функциональные улучшения по сравнению с интерактивными и программирующими использовать.

В то время как операционная система GNU предоставляет другие оболочки, включая версия csh, BASH - это оболочка по умолчанию. Как и другие программы GNU, Bash довольно портативен. В настоящее время он работает почти на всех версиях Unix и несколько других операционных систем - независимо поддерживаемые порты существуют для платформ MS-DOS, OS/2 и Windows.

Ответ 7

В других ответах обычно указывалось различие между Bash и стандартом оболочки POSIX. Однако при написании переносимых сценариев оболочки и использовании синтаксиса Bash список типичных базизмов и соответствующих чистых решений POSIX очень удобен. Такой список был скомпилирован, когда Ubuntu переключился с Bash на Dash в качестве системной оболочки по умолчанию и может быть найден здесь: https://wiki.ubuntu.com/DashAsBinSh

Кроме того, есть отличный инструмент под названием checkbashisms, который проверяет bashisms в вашем script и подходит, когда вы хотите убедиться, что ваш script переносится.

Ответ 8

/bin/sh может вызвать или не вызывать ту же программу, что и /bin/bash.

sh поддерживает по крайней мере функции требуемые POSIX (при условии правильной реализации). Он также может поддерживать расширения.

bash, "Bourne Again Shell", реализует функции, необходимые для sh + bash -специфических расширений. Полный набор расширений слишком длинный для описания здесь, и он отличается от новых выпусков. Различия описаны в руководстве bash. Введите info bash и прочитайте раздел "Bash Возможности" (раздел 6 в текущей версии) или прочитайте текущую документацию .

Ответ 9

Bash (bash) - одна из многих доступных (но наиболее часто используемых) оболочек Unix. Bash означает "Bourne Again SHell" и является заменой/улучшением оригинальной оболочки Bourne (sh).

Shell scripting работает с скриптами в любой оболочке, тогда как сценарий Bash написан скриптом специально для Bash.

Ответ 11

Баш и Ш - это две разные оболочки. В основном 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, когда это не обязательно.

Ответ 12

sh (более или менее) является подмножеством bash.

sh происходит от POSIX (P ortable O perating S ystem I Iterface), который нацелен на объединение Unix/Linux через общий язык и т.д. Этот общий переносимый язык - sh, и он стандартизирован IEEE и доступен на любой машине linux/unix (также называемой "POSIX-совместимой").

bash немного новее, чем sh, и стремится быть POSIX-совместимым (поэтому он предназначен для запуска большинства сценариев sh) и доступен почти на всех машинах linux/unix и обычно используется по умолчанию.

Ответ 13

Операционная система Linux предлагает различные типы оболочек. Хотя оболочки имеют много общих команд, каждый тип имеет уникальные функции. Давайте изучать различные типы используемых в основном снарядов.

Sh оболочка:

Sh shell также известен как Bourne Shell. Sh shell - первая оболочка, разработанная для компьютеров Unix Стивеном Борном в AT & T Bell Labs в 1977 году. Она включает в себя множество инструментов сценариев.

Баш-оболочка:

Оболочка Bash означает Bourne Again Shell. Оболочка Bash является оболочкой по умолчанию в большинстве дистрибутивов Linux и заменяет Sh Shell (Sh shell также будет работать в оболочке Bash). Bash Shell может выполнять подавляющее большинство скриптов Sh shell без изменений и также предоставлять функции редактирования строк команд.