При написании shell-программ мы часто используем /bin/sh
и /bin/bash
. Я обычно использую bash
, но я не знаю, в чем разница между ними.
В чем основная разница между bash
и sh
?
Что нужно знать при программировании на bash
и sh
?
sh
(или командный язык Shell) - это язык программирования, описанный в POSIX
стандартом.
Он имеет множество реализаций (ksh88
, dash
, ...). bash
также можно
считать реализацией sh
(см. ниже).
Поскольку sh
- это спецификация, а не реализация, /bin/sh
является симлинком
(или жесткой ссылкой) на фактическую реализацию в большинстве POSIX-систем.
bash
начинался как sh
-совместимая реализация (хотя он предшествовал стандарту POSIX на несколько лет), но с течением времени он приобрел множество расширений. Многие из этих расширений могут изменять поведение действительных сценариев оболочки POSIX, поэтому сам по себе bash
не является действительной оболочкой POSIX. Скорее, это диалект языка оболочки POSIX.
bash
поддерживает переключатель --posix
, который делает его более POSIX-совместимым. Он также пытается имитировать POSIX, если вызывается как sh
.
Долгое время /bin/sh
указывал на /bin/bash
в большинстве систем GNU/Linux. В результате стало почти безопасно игнорировать разницу между ними. Но недавно ситуация начала меняться.
Некоторые популярные примеры систем, в которых /bin/sh
не указывает на /bin/bash
(а в некоторых из них /bin/bash
может даже не существовать):
sh
по умолчанию указывает на dash
;initramfs
. Он использует реализацию оболочки ash
.pdksh
, потомок оболочки Korn. FreeBSD' sh
является потомком оригинальной оболочки Bourne для UNIX. Solaris имеет свой собственный sh
, который долгое время не был POSIX-совместимым; бесплатная реализация доступна от Heirloom project.Как вы можете узнать, на что указывает /bin/sh
в вашей системе?
Сложность заключается в том, что /bin/sh
может быть символической или жесткой ссылкой.
Если это символическая ссылка, то [портативный][posix-файл] способ решить ее следующий:
% 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
по следующим причинам:
bash
, они обязаны иметь sh
.Использование bash
также имеет свои преимущества. Его возможности делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные и массивы. Простой sh
- это очень минималистичный язык программирования.
sh
: http://man.cx/sh
bash
: http://man.cx/bash
TL;DR: bash
- это супермножество sh
с более элегантным синтаксисом и большей функциональностью. Почти во всех случаях безопасно использовать строку bash shebang, так как она довольно широко распространена на современных платформах.
NB: в некоторых окружениях sh
является bash
. Проверьте sh --version
.
Этот вопрос неоднократно выдвигался в качестве канонического для людей, которые пытаются использовать " ш " и удивляются, что это's не ведут себя так же, как Баш
. Здесь'ы краткое описание: распространенные ошибки и подводные камни.
Во-первых, вы должны понять, чего ожидать.
ш имя_скрипта
, или запустить его с название файла
и `#!/Бен/Ш в [притон](https://en.wikipedia.org/wiki/Shebang_(ОС UNIX)) линии, следует ожидать, что поведение POSIX "ш"., или запустить его с
название файлаи
#!/бин/Баш` (или местный эквивалент) в строке притон, следует ожидать, что поведение Баш.Имея правильный набор и запустив сценарий, вписав только имя скрипта (возможно, с относительный или полный путь) обычно предпочтительным решением. В дополнение к правильному притон, это требует файл сценария, чтобы иметь разрешение execute (команду chmod а+X имя_скрипта
).
Итак, чем же они собственно отличаются?
Баш справочное руководство имеет раздел который пытается перечислить differences но некоторые общие источники проблем является
[[
указывает на ш
(только [
, который является более неуклюжим и ограниченным).местный
, источник
, функция
, shopt
, давай
, объявление
и выберите
не переносимы на "ш". (В некоторых реализациях "ш", например, поддержка "местных".)цикла,
+=приращение назначения и т. д. В
$'строку\nwith\ТС\aescapes'` функция ориентировочно принят для POSIX (в смысле он работает в bash, но пока не поддерживается " Ш " на системах, которые только присоединиться к текущей спецификации POSIX, и, вероятно, не будет в течение некоторого времени).<<<'здесь строки'
.*.расширение {PNG или JPG}
и {0..12}
скобки.~
относится к $Home
и только в bash (и вообще ~имя пользователя в домашний каталог
имя пользователя).</дел><ины>Это в POSIX, но могут отсутствовать некоторые предварительно в POSIX
/Бен/ш` реализаций.</ИНС><(УМК)
и в >(УМК)
.&|
на 2>&1 |
и &АМП;>
Для в > ... 2>&1
${подстрока:1:2}
, ${переменная/шаблон/замена}
, преобразование регистра и т. д.$[выражение]
синтаксис, который, однако, должен быть заменен с POSIX арифметика $((выражение))
синтаксис. (Некоторые устаревшие до-в POSIX реализации " Ш " может не поддержать, что, хотя.)$случайный
, $секунд
, $PIPESTATUS[@]
и $ИМЯ_ФУНКЦИИ
являются расширениями Баш.и
[и"Х" и = = на "Г", У], который не портативный (
экспорт переменной должны быть отделены от переменной, и портативный сравнения строки в [ ... ]
используется один знак равенства).Помните, что это сокращенный листинг. Обратитесь к справочному руководству для полный совок, и http://mywiki.wooledge.org/Bashism для многих обходных путей; и/или попробовать http://shellcheck.net/ которая предупреждает для многих Баш-только особенности.
Распространенной ошибкой является #!/бин/Баш
притон линии, но потом все-таки через ш имя_скрипта
на самом деле запустить скрипт. В основном это отключает любые Баш-только функциональность, поэтому вы получаете синтаксические ошибки, например, пытаются использовать массивы. (Shebang линия является синтаксически комментарий, так это просто игнорироваться в этом случае.)
К сожалению, Баш не предупреждает, когда вы пытаетесь использовать эти конструкции, когда это вызывается как "ш". Это вовсе't полностью запретить все Баш-только функциональностью, так что Баш работает, вызывая его как " Ш " это не хороший способ проверить, если ваш скрипт правильно портативный ash
/dash
/в POSIX ш
или вариантов как реликвия ш
Сообщение от UNIX.COM
Раковина в отеле
В таблице ниже перечислены большинство функций, которые я думаю, заставит вас выбрать один снаряд за другим. Он не предназначен, чтобы быть окончательный список и не включать каждый возможные функции для каждого возможного снаряда. Функция рассматривается только в оболочке, если в версии, которая поставляется вместе с операционной системой, или если он доступен, собранные непосредственно из стандартного дистрибутива. В частности, с Shell, указанная ниже, которые доступны на SunOS 4.*, немалое количество поставщиков теперь корабль либо пробовал или собственные усовершенствованные оболочки 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
Ключ к таблице выше.
У функции может быть сделано с помощью этой оболочки.
Особенности N нет в оболочке.
Функция f может быть сделано только с помощью функции оболочек механизм.
Л библиотека 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.
Оболочка - это интерфейс между пользователем и ОС для доступа к сервисам операционной системы. Это может быть как графический интерфейс, так и интерфейс командной строки (CLI).
sh (Bourne shell) - это интерпретатор командной строки shell для Unix/Unix-подобных операционных систем. Он предоставляет некоторые встроенные команды. На языке сценариев мы обозначаем интерпретатор как #!/bin/sh
. Он наиболее широко поддерживается другими оболочками, такими как bash (свободный/открытый), kash (не свободный).
Bash (Bourne again shell) - это оболочка, заменяющая оболочку Bourne. Bash является супермножеством sh. Bash поддерживает sh. POSIX - это набор стандартов, определяющих, как должны работать POSIX-совместимые системы. На самом деле Bash не является POSIX-совместимой оболочкой. В языке сценариев мы обозначаем интерпретатор как #!/bin/bash
.
Аналогия:
Терминал
Шелл
ВГ против. Баш
ВГ
Баш
СПРАВОЧНЫЙ МАТЕРИАЛ:
Шелл gnu.org:
В свою базу, а оболочки-это просто макро-процессор что выполняет команды. Термин макро процессор означает функциональность, где текст и символы расширяются, чтобы создать более крупные выражения.
с Unix оболочки-это и командный интерпретатор и язык программирования. как командный интерпретатор, оболочка предоставляет пользователю интерфейс богатый набор утилит GNU. Возможности языка программирования позволяют эти программы должны быть объединены. Файлы, содержащие команды может быть созданы, и становятся сами команды. Эти новые команды такие же состояния как системные команды в каталогах, таких как /bin, позволяя пользователи и группы по созданию пользовательских сред для автоматизации общие задачи.
снаряды могут быть использованы в интерактивном или неинтерактивном режиме. В интерактивном В режиме, они принимают входные данные введенные с клавиатуры. При выполнении не в интерактивном режиме, снаряды выполнять команды чтения из файла.
оболочка позволяет выполнение ГНУ команды, синхронно и асинхронно. Оболочка ждет синхронной команды для завершения прежде чем принимать ввод; асинхронные команды продолжают выполняться В параллель с корпусом, в то время как он читает и выполняет дополнительные команды. Конструкции перенаправление позволяют тонко контролировать ввод и вывод этих команд. Кроме того, оболочка позволяет контроль над содержанием сред команд.
снаряды предоставляем небольшого набора встроенных команд (примитивы) реализация функциональности невозможно или неудобно получить через отдельные коммунальные услуги. Например, CD, перерыв, продолжится, и exec не может быть реализована вне оболочки, поскольку они напрямую манипулировать сама оболочка. Истории, команде getopts, убить, или дуо примитивы, среди другие, может быть реализовано в отдельной утилиты, но они более удобно использовать в качестве встроенных команд. Все примитивы оболочки описаны в последующих разделах.
время выполнения команд имеет важное значение, большая часть мощности (и сложность) снаряды из-за их встроенных языков программирования. как и любой язык высокого уровня, оболочка обеспечивает переменные, поток В конструкции управления, цитирование и функции.
снаряды предлагают функции, специально предназначенные для интерактивного использования, а чем дополнить языка программирования. Эти интерактивные функции включают задания на контроль, редактирование командной строки, история команд и псевдонимы. Каждая из этих функций описана в данном руководстве.
Баш gnu.org:
bash-это оболочка или командный язык переводчик, для GNU операционная система. Название-это акроним для ‘Борн-опять оболочка’, каламбур на Стивена Борна, автора прямой предок В текущей оболочки Unix SH, который появился в седьмой лаборатории Белл научно-исследовательские версии Unix.
bash это во многом совместимый с sh и включает в себя полезные функции из Korn-оболочки KSH и оболочки c хсг. Это предназначается, чтобы быть совместимые реализации стандарта POSIX стандарта IEEE Shell и инструменты часть По спецификации POSIX стандарта IEEE (стандарт IEEE 1003.1). Он предлагает функциональные улучшения по сравнению с SH для интерактивного программирования использование.
В то время как операционная система GNU предоставляет другие снаряды, в том числе версия хсг bash является стандартной командной оболочкой. Как и другие программы GNU, bash это довольно портативный. В настоящее время она работает почти на всех версиях Unix и нескольких других операционных системах - самостоятельно-поддерживается порты существует для MS-DOS и OS/2 и Windows-платформах.
Другие ответы, как правило, указана разница между bash и стандартной оболочке POSIX. Однако, при написании переносимых сценариев оболочки и используется для Баш синтаксис, список типичных bashisms и соответствующих чистых растворах POSIX это очень удобно. Такой список был составлен, когда Убунту перешел из баш на Даш, как системы по умолчанию оболочки и может быть найден здесь: https://wiki.ubuntu.com/DashAsBinSh
Кроме того, есть отличный инструмент под названием checkbashisms, который проверяет bashisms в вашем скрипте и удобна, когда вы хотите, чтобы убедиться, что ваш сценарий является портативным.
/Бен/Ш
может или не может вызвать такую же программу, как /Бен/Баш
.
"ш" поддержка по крайней мере возможности требуются POSIX (при условии правильной реализации). Он может также поддерживать расширения.
баш
, в "снова оболочки Bourne", которая реализует функции, необходимые для SH плюс Баш-конкретными расширениями. Полный набор расширений слишком много, чтобы здесь описывать, и она варьируется в зависимости от новых релизов. Различия описаны в руководстве Баш. Тип инфо Баш и читаю в "Особенности баш на" (раздел 6 в текущей версии) или прочитать в текущей документации.
bash и SH-это два разных снарядов. В основном bash является Ш., С больше функций и лучше синтаксис. Большинство команд работают одинаково, но они разные.Баш (Баш) является одним из многих доступных (но наиболее часто используемый) оболочки Unix. Баш выступает за "снова Борна",и замена/усовершенствование оригинальной оболочки Bourne (ш).
Оболочки сценариев сценариев в любой оболочке, в то время как Баш скриптинга написания скриптов специально для bash. На практике, однако, на "скрипт" и "баш скрипт" и часто используются как синонимы, если оболочка не Баш.
Сказав это, вы должны понимать, как /bin/sh на большинство систем будет символической ссылке, а не ссылаться на ш. В Ubuntu /Бен/ш используются для ссылки на баш, типичное поведение в дистрибутивах Linux, но теперь изменилось для ссылок на другой консоли с названием DASH. Я бы использовать bash, как это в значительной степени стандартным (или, по крайней мере, чаще всего, из моего опыта). На самом деле, проблемы возникают, когда bash-скрипт будет использовать #!/бин/SH, потому что сценарий-производитель берет на ссылку, чтобы колотить, когда она не'т должны быть.
"ш" (более или менее) подмножество Баш
.
"ш" происходит от стандарта POSIX (Рortable орабочие овсистемы яминимальная подписка), который направлен на унификацию с Unix/Linux над общий язык и т. д. Что общего, портативный, язык-это "ш", и это's и стандартизирован IEEE и доступен на любой Linux/Unix систем (ПРО ака;POSIX-совместимые и") машина.
Баш
немного новее, чем "ш", и стремится быть POSIX-совместимые (так что's предназначены для выполнения самых " ш " скрипты) и доступен почти на всех ОС Linux/Unix и, как правило, используется по умолчанию.
Операционная система Linux предлагает различные типы оболочки. Хотя снаряды есть много команд в общем, каждый вид обладает уникальными особенностями. Рассмотрим различный вид в основном использовали снаряды.
ВГ основа:
Ш. Шелл также известен как оболочки Bourne. Ш. Shell-это первая оболочка, разработанная для компьютеров Unix Стивен Борн в AT&Т'ы лаборатории Белл в 1977 году. Она включает много инструментов сценариев.
Оболочки Bash :
Оболочки Bash означает Борна оболочке. Оболочки Bash является оболочкой по умолчанию в большинстве дистрибутивов Linux и заменить Ш оболочку (SH Shell также будет работать в оболочке bash) . Оболочки Bash может выполнять подавляющее большинство SH скрипты оболочки без изменений и обеспечивают команд редактирования также.