it-swarm.com.ru

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

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

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

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

1087
Weiwei Yang

Что такое ш

sh (или язык командных оболочек) - это язык программирования, описанный с помощью стандарт POSIX . Он имеет много реализаций (ksh88, dash, ...). bash также можно считать реализацией sh (см. ниже).

Поскольку sh является спецификацией, а не реализацией, /bin/sh является символической ссылкой (или жесткой ссылкой) на фактическую реализацию в большинстве систем POSIX.

Что такое bash

bash начиналась как sh-совместимая реализация (хотя она предшествует стандарту POSIX на несколько лет), но со временем она приобрела множество расширений. Многие из этих расширений могут изменить поведение допустимых сценариев POSIX Shell, поэтому само по себе bash не является допустимым POSIX Shell. Скорее, это диалект языка POSIX Shell.

bash поддерживает переключатель --posix, что делает его более совместимым с POSIX. Он также пытается имитировать POSIX, если вызывается как sh.

ш = баш?

Долгое время /bin/sh использовался для указания на /bin/bash в большинстве систем GNU/Linux. В результате почти стало безопасным игнорировать разницу между ними. Но это начало меняться в последнее время.

Вот некоторые популярные примеры систем, где /bin/sh не указывает на /bin/bash (и в некоторых из которых /bin/bash может даже не существовать):

  1. Современные системы Debian и Ubuntu, которые по умолчанию имеют символическую ссылку sh на dash;
  2. Busybox , который обычно запускается во время загрузки системы Linux как часть initramfs. Он использует реализацию оболочки ash.
  3. BSD и вообще любые не-Linux системы. OpenBSD использует pdksh, потомка оболочки Korn. FreeBSD sh является потомком оригинальной UNIX Bourne Shell. У Solaris есть свое собственное sh, которое долгое время не было POSIX-совместимым; бесплатная реализация доступна из проект семейной реликвии .

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

982
Roman Cheplyaka

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

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

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

113
Rein Henrichs

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

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

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

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

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

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

  • [[ недоступен в sh (только [, который более неуклюж и ограничен).
  • sh не имеет массивов.
  • Некоторые ключевые слова Bash, такие как local, source, function и select, не являются переносимыми для sh. (Некоторые реализации sh поддерживают, например, local.)
  • Bash имеет много расширений синтаксиса в стиле C, таких как $'string\nwith\tC\aescapes' и цикл for((i=0;i<=3;i++)) с тремя аргументами, присваивание приращения += и т.д.
  • 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 значительно расширил возможности арифметики Shell (хотя по-прежнему нет поддержки с плавающей точкой).
  • Множество расширений Bash-only для включения или отключения необязательного поведения и раскрытия внутреннего состояния командной консоли.
  • Много, много удобных функций для интерактивного использования, которые, однако, не влияют на поведение скрипта.

Помните, это сокращенный список. Обратитесь к справочному руководству за полным совком и http://mywiki.wooledge.org/Bashism для многих хороших обходных путей; и/или попробуйте http://shellcheck.net/ , который предупреждает о многих функциях только для Bash.

Распространенной ошибкой является наличие строки #!/bin/bash Shebang, но, тем не менее, использование sh scriptname для фактического запуска сценария. Это в основном отключает любые функции Bash-only, поэтому вы получаете синтаксические ошибки, например за попытку использовать массивы.

К сожалению, Bash не будет предупреждать, когда вы пытаетесь использовать эти конструкции, когда он вызывается как sh. Он также не полностью отключает все функциональные возможности только Bash, поэтому запуск Bash путем вызова его как sh не является хорошим способом проверить, является ли ваш скрипт правильно переносится на ash / dash /POSIX sh или такие варианты, как фамилия sh

54
tripleee

Сообщение от NIX.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 должна быть связана с Shell, чтобы включить эту функцию.

Примечания к таблице выше

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.
47
SriniV

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

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

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

Аналогия:

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

enter image description here

34
Premraj

ТЕРМИНАЛ

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

Shell

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

SH Vs. BASH

SH

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

BASH

  • (Bourne-Again Shell)
  • Это конкретная оболочка
  • интерпретатор команд и язык программирования
  • Имеет функциональность и многое другое
  • Преемник СХ
  • BASH - оболочка по умолчанию

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

Shell gnu.org:

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

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

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

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

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

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

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

BASHgnu.org:

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

Bash в значительной степени совместим с sh и включает полезные функции из Korn Shell ksh и C Shell csh. Предполагается, что это будет совместимая реализация части IEEE POSIX Shell and Tools спецификации IEEE POSIX (стандарт IEEE 1003.1). Он предлагает функциональные улучшения по сравнению с sh для интерактивного использования и программирования.

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

22
Timothy L.J. Stewart

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

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

14
Andrzej Pronobis

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

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

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

3
Keith Thompson

баш и Ш - это две разные оболочки. В основном bash это sh, с большим количеством функций и лучшим синтаксисом. Большинство команд работают одинаково, но они разные. Bash (bash) - одна из многих доступных (но наиболее часто используемых) оболочек Unix. Bash расшифровывается как "Bourne Again Shell" и является заменой/улучшением оригинальной Bourne Shell (sh).

Сценарии оболочки - это сценарии в любой оболочке, тогда как сценарии Bash - сценарии специально для Bash. Однако на практике "сценарий оболочки" и "сценарий bash" часто используются взаимозаменяемо, если речь не идет о Bash.

Сказав это, вы должны понимать, что/bin/sh на большинстве систем будет символической ссылкой и не будет вызывать sh. В Ubuntu/bin/sh используется для ссылки на bash, типичное поведение в дистрибутивах Linux, но теперь изменилось на соединение с другой оболочкой, называемой dash. Я бы использовал bash, поскольку это в значительной степени стандарт (или, по крайней мере, наиболее распространенный, из моего опыта). Фактически, проблемы возникают, когда сценарий bash будет использовать #!/Bin/sh, потому что создатель сценария предполагает, что ссылка должна быть bash, когда это не обязательно.

0
Gopika BG