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

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

1104 голосов
/ 20 апреля 2011

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

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

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

Ответы [ 10 ]

991 голосов
/ 20 апреля 2011

Что такое 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 может даже не существовать):

  1. Современные системы Debian и Ubuntu, которые по умолчанию обозначают sh до dash;
  2. Busybox , который обычно запускается во время загрузки системы Linux как часть initramfs.Он использует реализацию оболочки ash.
  3. 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 - очень минималистичный язык программирования.

115 голосов
/ 20 апреля 2011

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

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

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

54 голосов
/ 08 марта 2017

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

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

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

Как правило, предпочтительнее иметь правильный shebang и запустить скрипт, набрав только имя скрипта (возможно, с относительным или полным путем). В дополнение к правильному 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, но, возможно, с некоторыми POSIX /bin/sh реализации.
  • Bash имеет процесс подстановки с <(cmd) и >(cmd).
  • Bash имеет псевдонимы для удобного перенаправления в стиле Csh, такие как &| для 2>&1 | и &> для > ... 2>&1
  • Bash поддерживает сопроцессы с перенаправлением <>.
  • Bash предлагает широкий набор расширений нестандартных параметров, таких как ${substring:1:2}, ${variable/pattern/replacement}, преобразование регистра и т. Д.
  • Bash значительно расширил возможности арифметики оболочки (хотя по-прежнему нет поддержки с плавающей точкой).
  • Множество расширений 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

47 голосов
/ 04 августа 2015

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

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

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.
35 голосов
/ 09 февраля 2015

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

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

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

Аналогия:

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

enter image description here

22 голосов
/ 03 сентября 2016

TERMINAL

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

SHELL

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

SH Vs.BASH

SH

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

BASH

  • (Bourne-Again SHell)
  • Является лиспециальная оболочка
  • интерпретатор команд и язык программирования
  • Имеет функциональность sh и многое другое
  • Преемник 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 Исследовательская версия Unix.

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

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

14 голосов
/ 18 мая 2015

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

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

3 голосов
/ 09 апреля 2015

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

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

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

1 голос
/ 16 мая 2019

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

0 голосов
/ 25 июня 2018

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

Sh shell:

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

Оболочка Bash:

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

...