Разница между sh и bash
При написании программ оболочки мы часто используем /bin/sh
а также /bin/bash
, Я обычно использую bash
, но я не знаю, в чем разница между ними.
В чем главное отличие bash
а также sh
?
Что нам нужно знать при программировании bash
а также sh
?
9 ответов
Что такое ш
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
может даже не существовать) являются:
- Современные системы Debian и Ubuntu, которые символическая ссылка
sh
вdash
по умолчанию; - Busybox, который обычно запускается во время загрузки системы Linux как часть
initramfs
, Он используетash
реализация оболочки. - BSD и вообще любые не-Linux системы. OpenBSD использует
pdksh
потомок скорлупы корн. файле FreeBSDsh
является потомком оригинальной оболочки UNIX Bourne. Солярис имеет свой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 поддерживают его.
Линия Шебанг
В конечном счете, вам решать, какой из них использовать, написав строку "шебанг".
Например
#!/bin/sh
буду использовать sh
(и на что бы это ни указывало),
#!/bin/bash
буду использовать /bin/bash
если это доступно (и не с сообщением об ошибке, если это не так). Конечно, вы также можете указать другую реализацию, например,
#!/bin/dash
Какой использовать
Для моих собственных сценариев я предпочитаю sh
по следующим причинам:
- это стандартизировано
- это намного проще и легче учиться
- он переносим через системы POSIX - даже если они не имеют
bash
они должны иметьsh
Есть преимущества в использовании bash
также. Его особенности делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные и массивы. гладкий sh
это очень минималистичный язык программирования.
sh
: http://man.cx/shbash
: http://man.cx/bash
TL; DR: bash
это надмножество sh
с более элегантным синтаксисом и большей функциональностью. Безопасно использовать линию bash-shebang почти во всех случаях, поскольку она довольно распространена на современных платформах.
NB: в некоторых средах sh
является bash
, Проверьте sh --version
,
Этот вопрос часто называют каноническим для людей, которые пытаются использовать 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
,function
, а такжеselect
не переносимыsh
, - Bash имеет много расширений синтаксиса в стиле C, таких как
$'string\nwith\tC\aescapes'
и три аргументаfor((i=0;i<=3;i++))
петли,+=
приращение и т. д. - Bash поддерживает
<<<'here strings'
, - Баш имеет
*.{png,jpg}
а также{0..9}
расширение скобки. Это в POSIX, но, возможно, затуманивается от некоторых pre-POSIX~
относится к$HOME
только в Bash (и вообще~username
в домашний каталогusername
)./bin/sh
Реализации.- Bash имеет процесс замены
<(cmd)
а также>(cmd)
, - Bash поддерживает сопроцессы с
<>
Перенаправление. - Bash значительно расширил возможности арифметики оболочки (хотя по-прежнему нет поддержки с плавающей точкой) и манипулирования переменными подстрокой с помощью
${substring:1:2}
,${variable/pattern/replacement}
, преобразование дела и т. д. - Множество расширений Bash-only для включения или отключения необязательного поведения и раскрытия внутреннего состояния оболочки.
- Много, много удобных функций для интерактивного использования, которые, однако, не влияют на поведение скрипта.
Помните, это сокращенный список. Обратитесь к справочному руководству для полного совка, и http://mywiki.wooledge.org/Bashism для многих хороших обходных путей; и / или попробуйте http://shellcheck.net/ который предупреждает о многих функциях только для Bash.
Распространенной ошибкой является наличие #!/bin/bash
линия Шебанга, но затем, тем не менее, используя sh scriptname
на самом деле запустить скрипт. Это в основном отключает любые функции Bash-only, поэтому вы получаете синтаксические ошибки, например, при попытке использовать массивы.
К сожалению, Bash не будет предупреждать, когда вы пытаетесь использовать эти конструкции, когда он вызывается как sh
, Он также не полностью отключает все функции Bash-only, поэтому запустите Bash, вызвав его как sh
это не хороший способ проверить, является ли ваш скрипт правильно переносимым ash
/ dash
/ POSIX sh
или варианты, такие как семейная реликвия sh
Shell - это интерфейс между пользователем и ОС для доступа к сервисам операционной системы. Это может быть GUI или CLI (интерфейс командной строки).
sh (Bourne sh ell) - интерпретатор командной строки оболочки для Unix/Unix-подобных операционных систем. Он предоставляет некоторые встроенные команды. В скриптовом языке мы обозначаем переводчика как #!/bin/sh
, Это была наиболее широко поддерживаемая оболочка, такая как bash (free/open), kash (не free).
Баш (B черт возьми) - это замена оболочки Борна. Bash это суперсет sh. Баш поддерживает ш. POSIX- это набор стандартов, определяющих, как должны работать POSIX-совместимые системы. Bash на самом деле не является POSIX-совместимой оболочкой. На языке сценариев мы обозначаем переводчика как #!/bin/bash
,
Аналогия:
- Оболочка похожа на интерфейс или спецификации или API.
- sh это класс, который реализует интерфейс Shell.
- Bash является подклассом sh.
Пост из 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.
ТЕРМИНАЛ
- программа (ы), которая поднимает окно
- 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.
Другие ответы обычно указывают на разницу между Bash и стандартом оболочки POSIX. Однако при написании переносимых сценариев оболочки и использовании их в синтаксисе Bash список типичных bashisms и соответствующих чистых решений POSIX очень удобен. Такой список был скомпилирован, когда Ubuntu переключился с Bash на Dash в качестве системной оболочки по умолчанию, и его можно найти здесь: https://wiki.ubuntu.com/DashAsBinSh
Кроме того, есть отличный инструмент, называемый checkbashisms, который проверяет наличие bashisms в вашем скрипте и оказывается полезным, когда вы хотите убедиться, что ваш скрипт переносим.
Они почти идентичны, но bash
имеет больше возможностей -sh
является (более или менее) более старым подмножеством bash
.
sh
часто означает оригинал Bourne shell
, который предшествует bash
(Bourne *again* shell
), и был создан в 1977 году. Но на практике, возможно, лучше было бы думать об этом как о высококросс-совместимой оболочке, соответствующей стандарту POSIX 1992 года.
Скрипты, начинающиеся с #!/bin/sh
или используйте sh
shell обычно делает это для обратной совместимости. Любая ОС unix/linux будет иметьsh
ракушка. На Ubuntush
часто вызывает dash
а в MacOS это специальная версия POSIX bash
. Эти оболочки могут быть предпочтительнее для стандартного поведения, скорости или обратной совместимости.
bash
новее оригинала sh
, добавляет больше функций и стремится к обратной совместимости с sh
. Теоретически,sh
программы должны работать в bash
. bash
доступен почти на всех машинах linux/unix и обычно используется по умолчанию - за заметным исключением MacOS, по умолчанию zsh
как у Каталины (10.15). FreeBSD по умолчанию не поставляется сbash
установлен.
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, хотя это не обязательно.
/bin/sh
может или не может вызывать ту же программу, что и /bin/bash
,
sh
поддерживает, по крайней мере, функции, необходимые для POSIX (при условии правильной реализации). Он также может поддерживать расширения.
bash
"Bourne Again Shell" реализует функции, необходимые для расширений sh плюс bash. Полный набор расширений слишком длинный, чтобы описывать его здесь, и он меняется в зависимости от новых выпусков. Различия описаны в руководстве по bash. Тип info bash
и прочитайте раздел "Возможности Bash" (раздел 6 в текущей версии) или прочитайте текущую документацию онлайн.
Различия максимально просты:после базового понимания другие комментарии, размещенные выше, будет легче уловить.
Оболочка - "Оболочка" - это программа, которая облегчает взаимодействие пользователя с операционной системой (ядром). Доступно множество реализаций оболочки, например sh, bash, csh, zsh... и т. Д.
Используя любую из программ оболочки, мы сможем выполнять команды, которые поддерживаются этой программой оболочки.
Bash - Это происходит от B ourne-в усиления Ш. ELL. Используя эту программу, мы сможем выполнять все команды, указанные Shell. Также мы сможем выполнять некоторые команды, специально добавленные в эту программу. Bash имеет обратную совместимость с sh.
Sh - Это происходит от Bourne Sh ell. "sh" поддерживает все команды, указанные в оболочке. Значит, с помощью этой программы мы сможем выполнять все команды, указанные Shell.
Для получения дополнительной информации выполните:- https://man.cx/sh - https://man.cx/bash
Bash ( bash) - одна из многих доступных (но наиболее часто используемых) оболочек Unix. Bash расшифровывается как "Bourne Again SHell" и является заменой / улучшением оригинальной оболочки Bourne ( sh).
Сценарии оболочки - это сценарии в любой оболочке, тогда как сценарии Bash - сценарии специально для Bash.
Операционная система 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 без модификации, а также предоставляет возможность редактирования командной строки.