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

1041

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

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

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

  • 19
    Для полезного списка bashisms и соответствующего кода, который работает на оболочке Bourne, см. Mywiki.wooledge.org/Bashism.
  • 1
    Возможно, вы захотите увидеть стандарт POSIX для sh и его командный язык: * sh * Shell Command Language
Показать ещё 1 комментарий
Теги:
sh

11 ответов

900

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

  • 0
    Сайт FreeBSD сообщает, что в настоящее время tcsh является оболочкой по умолчанию freebsd.org/doc/en/articles/linux-users/article.html#shells
  • 13
    Это, вероятно, означает, что они указывают /bin/tcsh в качестве интерактивной оболочки по умолчанию в /etc/passwd , а не то, что они используют tcsh в качестве реализации sh . tcsh имеет синтаксис оболочки C; он даже отдаленно не совместим со стандартом sh POSIX. См. Freebsd.org/cgi/man.cgi?query=sh&sektion=1 для описания sh . FreeBSD.
Показать ещё 15 комментариев
105

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

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

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

  • 28
    если bash вызывается как sh, он ведет себя немного по-другому. См. Gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files («Вызывается с именем sh») и gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Например, нет процесса замены.
  • 9
    Поскольку bash является надмножеством sh, а в некоторых ОС, таких как FreeBSD, bash по умолчанию не установлен, сценарии в sh обеспечат большую переносимость.
Показать ещё 2 комментария
47

Сообщение из 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.
  • 0
    Ваша таблица мне не нужна, так как она пытается сравнить возможности оболочки Bourne и функции из ksh до 1988 года. Если вы действительно создадите таблицу для 1988 года, вам нужно будет удалить большинство других оболочек из этой таблицы, включая bash , sh и rc. Не могли бы вы объяснить, откуда вы получили значения для вашей таблицы?
  • 1
    Позвольте мне дать несколько советов: Job Control был добавлен в Bourne Shell в 1989 году, а Bourne Shell стал OpenSource в 2005 году. Оболочка Korn имеет процесс подмены как минимум с 1988 года, а с 1997 года - OpenSource. Кстати, ваши заявления относительно $ ENV неверны, $ ENV только для чтения / выполнения для интерактивных оболочек.
Показать ещё 7 комментариев
43

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

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

  • Если вы запускаете свой сценарий с sh scriptname или запускаете его с scriptname и в строке shebang есть #!/bin/sh scriptname #!/bin/sh, вам следует ожидать POSIX sh.
  • Если вы запускаете свой сценарий с bash scriptname сценария bash scriptname или запускаете его с scriptname и в scriptname есть #!/bin/bash scriptname #!/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++)) цикла 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 значительно расширил возможности арифметики оболочки (хотя все еще не поддерживает плавающую точку).
  • Множество расширений Bash-only для включения или отключения необязательного поведения и раскрытия внутреннего состояния оболочки.
  • Много, много удобных функций для интерактивного использования, которые, однако, не влияют на поведение скрипта.

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

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

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

  • 1
    По сути , ответ TL; DR является ответом А.
  • 2
    Shellcheck.net было все, что мне нужно. большое спасибо.
30

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.

Изображение 3878

  • 2
    Я не понимаю Вы упомянули как «Bash - это суперсет sh», так и «Bash - это подкласс sh», не являются ли они противоположными утверждениями? Можете ли вы уточнить?
  • 4
    Я думаю, что это пытается сказать, что Bash наследует от sh (так что это «подкласс» в смысле ООП) и расширяет его (как и расширенный набор функций).
22

ТЕРМИНАЛ

  • программа (ы), которая помещает окно вверх
  • 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.

14

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

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

  • 0
    Это в основном то, к чему мой ответ на данный момент действительно сводится. +1
3

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

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

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

  • 0
    sh дает вам оболочку POSIX только в том случае, если в вашей текущей оболочке установлен правильный PATH . Не существует определенного PATH-имени, которое дает вам оболочку POSIX.
  • 0
    Долгое время sh не обязательно даже давал вам оболочку POSIX, например, в Solaris.
2

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

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

1

Вы можете увидеть POSIX стандарт для sh и его командный язык:

-2

Операционная система 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 без изменений и также предоставлять функции редактирования строк команд.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню