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

1305

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

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

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

Вейвэй Ян
источник
21
Для получения полезного списка bashisms и соответствующего кода, который работает на оболочке Bourne, см. Mywiki.wooledge.org/Bashism
StackExchange saddens dancek
1
Возможно, вы захотите ознакомиться со стандартом POSIX для sh и его командным языком: * sh * Shell Command Language
Maurício C Antunes
7
Как правило, все sh-скрипты будут работать под bash благодаря его posix-совместимости, но не все bash-скрипты могут работать под sh, основные отличия, которые вы заметите, это такие вещи, как [[]] вместо [] сравнений, которые допускают пробелы без кавычек, $ (()) вместо $ [] арифметических выражений и других вещей, таких как «он слишком большой и слишком медленный» непосредственно из документации bash. Но новым сценариям не нужно ограничивать себя в sh-совместимых сценариях, если они не стреляют по некоторым обратная совместимость, что чаще всего не так в наши дни, в конце концов, это (или был ...) 2014 год прав?
osirisgothra

Ответы:

1142

Что такое ш

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

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

Что такое bash

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

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. У 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по следующим причинам:

  • это стандартизировано
  • это намного проще и легче учиться
  • он переносим через системы POSIX - даже если они не имеют bash, они должны иметьsh

Есть и преимущества в использовании bash. Его особенности делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные и массивы. Plain sh- очень минималистичный язык программирования.

Роман Чепляка
источник
Если вы запускаете скрипт с bashотображением пути, больше полезных сообщений об ошибках в случае синтаксической ошибки. Вы можете просто сэкономить время, используя bash.
PHPst
Что %означает в начале вашей командной строки?
Джозеф Харриотт
@JosephHarriott это подсказка: символ, напечатанный самой оболочкой, после которого следует ваша команда. Некоторые оболочки используют $вместо %или #для корневой оболочки.
Роман Чепляка
@RomanCheplyaka какие снаряды? Я только видел $и #...
Джозеф Харриотт
@RomanCheplyaka Я уверен, что shсуществовал задолго до bash (что означает «bourne-again shell»). Но это было очень примитивно и не отвечало на терминальные события, как ESCперсонажи. Затем kshпришел (также до bash), затем bash начали те, кто любил идею лучшей оболочки, но ненавидел ksh. :-)
raminr
145

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

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

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

Рейн Хенрикс
источник
31
если bash вызывается как sh, он ведет себя немного по-другому. См. Gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files («Вызывается с именем sh») и gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Например, нет процесса замены.
Гленн Джекман
11
Поскольку bash является надмножеством sh, а в некоторых ОС, таких как FreeBSD, bash по умолчанию не установлен, сценарии в sh обеспечат большую переносимость.
user674062
1
Поскольку не существует переносимого сценария для получения оболочки POSIX для конкретного сценария, переносимые сценарии не могут использовать больше возможностей Bourne Shell.
Щили
83

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

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

  • Если вы запустите скрипт с sh scriptname, или запустить его с scriptnameи иметь #!/bin/shв хижину линии, вы должны ожидать POSIXsh поведения.
  • Если вы запускаете свой сценарий с помощью 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 (это означает, что она работает в Bash сейчас, но пока не будет поддерживаться shв системах, которые придерживаются только текущего Спецификация POSIX, и, вероятно, не будет в течение некоторого времени, чтобы прийти).
  • 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 значительно расширил возможности арифметики оболочки (хотя все еще не поддерживает плавающую точку). Существует устаревший устаревший $[expression]синтаксис, который, однако, должен быть заменен арифметическим $((expression))синтаксисом POSIX . (Некоторое наследие pre-POSIXsh могут не поддерживать это.)
  • Волшебные переменные , такие как $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или варианты, такие как Heirloomsh

tripleee
источник
2
В принципе, TL; DR ersion является ответом и в .
tripleee
4
Shellcheck.net было все, что мне нужно. огромное спасибо.
Джош Хабдас
FWIW, export variable=valueпоручено POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Возможно, это недоступно в некоторых древних оболочках, но это определенно не башизм.
Роман Чепляка
54

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

Аналогия:

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

введите описание изображения здесь

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

Пост из 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.
SriniV
источник
Ваша таблица мне не нужна, так как она пытается сравнить возможности оболочки Bourne и функции из ksh до 1988 года. Если вы действительно создадите таблицу для 1988 года, вам нужно будет удалить большинство других оболочек из этой таблицы, включая bash , sh и rc. Не могли бы вы объяснить, откуда вы получили значения для вашей таблицы?
Щил
1
Позвольте мне дать несколько советов: Job Control был добавлен в оболочку Bourne в 1989 году, а оболочка Bourne была сделана OpenSource в 2005 году. Оболочка Korn имеет процесс подмены как минимум с 1988 года, а с 1997 года - OpenSource. Кстати, ваши заявления относительно $ ENV не верны, $ ENV только для чтения / выполнения для интерактивных оболочек.
Щили
3
@schily Это сообщение было взято с сайта cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV
@schily Если вы чувствуете, что это где-то неверно, пожалуйста, отредактируйте его соответствующим образом.
SriniV
8
Исходя из того, что разоблачено, может показаться, что было бы лучше удалить этот ответ, так как он по сути является мошенническим, а ОП на самом деле не проверял информацию, которую он вставил.
знаю
24

ТЕРМИНАЛ

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

РАКУШКА

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

SH Vs. BASH

SH

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

BASH

  • (Борн-снова Шелл)
  • Это конкретная оболочка
  • интерпретатор команд и язык программирования
  • Имеет функциональность и многое другое
  • Преемник СХ
  • 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.

Тимоти Л.Дж. Стюарт
источник
14

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

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

Анджей Пронобис
источник
Это в основном то, к чему мой ответ на данный момент действительно сводится. +1
трипл
8

Они почти идентичны, но 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 по умолчанию с zshCatalina (10.15). FreeBSD по умолчанию не поставляется с bashустановленным.

Райан Тейлор
источник
shдалеко предшествует POSIX. В наши дни вы надеетесь, что все, что shвы найдете, по крайней мере POSIX-совместимо; но в устаревших системах это ни в коем случае не является данностью. POSIX ставит гораздо больше, чем оболочка; на самом деле можно утверждать, что стандартизация вызовов операционной системы и библиотечных функций важнее.
tripleee
Я удалил материал о POSIX, чтобы сделать его менее запутанным
Райан Тейлор
3

/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.
tripleee
3

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

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

Оболочка - «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

Raihanhbh
источник
Чтобы понять POSIX, прочитайте ответ Алекса. Пожалуйста, проверьте: stackoverflow.com/a/1780614/1261003
Raihanhbh
Я не пытаюсь понять POSIX. Я проверяю ваш ответ, и поэтому мне нужно увидеть его. Я не думаю, что это так.
Скрат
Я полагаю, что эти небольшие разъяснения помогут новичку лучше понять жаргон, использованный в приведенных выше обсуждениях. @Scratte
Raihanhbh
-1

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

rashedcs
источник
Был более ранний снаряд Кена Томпсона. Оболочка Bourne была официально представлена ​​в Unix v7 (1979).
tripleee