При написании программ оболочки мы часто используем /bin/sh
и /bin/bash
. Обычно я использую bash
, но я не знаю, какая разница между ними.
Какое основное различие между bash
и sh
?
Что нам нужно знать при программировании в bash
и sh
?
При написании программ оболочки мы часто используем /bin/sh
и /bin/bash
. Обычно я использую bash
, но я не знаю, какая разница между ними.
Какое основное различие между bash
и sh
?
Что нам нужно знать при программировании в bash
и sh
?
sh
(или командный язык оболочки) - это язык программирования, описанный 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
является потомком исходной оболочки 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
по следующим причинам:
bash
, они должны иметь sh
Есть и преимущества использования bash
. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие области, как локальные переменные и массивы. Обычный sh
- очень минималистический язык программирования.
sh
: http://man.cx/sh bash
: http://man.cx/bash
TL; DR: bash
- это надмножество sh
с более элегантным синтаксисом и большей функциональностью. Безопасно использовать линию bash shebang почти во всех случаях, поскольку она довольно распространена на современных платформах.
NB: в некоторых средах sh
is bash
. Проверьте sh --version
.
Этот вопрос часто называют каноническим для людей, которые пытаются использовать sh
и удивляются, что он не ведет себя так же, как bash
. Вот краткое изложение распространенных недоразумений и подводных камней.
Прежде всего, вы должны понимать, чего ожидать.
sh scriptname
или с scriptname
и имеете #!/bin/sh
в строке shebang, вам следует ожидать поведения POSIX sh
.bash scriptname
или с помощью scriptname
и имеете #!/bin/bash
(или локальный эквивалент) в строке shebang, вам следует ожидать поведения Bash.Как правило, предпочтительным решением является наличие правильного shebang и запуск сценария путем ввода только имени сценария (возможно, с относительным или полным путем). В дополнение к правильному shebang, для этого требуется, чтобы файл сценария имел разрешение на выполнение (chmod a+x scriptname
).
Итак, чем они на самом деле отличаются?
Справочное руководство по Bash содержит раздел , в котором предпринята попытка перечислить различия, но некоторые распространенные источники путаницы включают
[[
недоступен в sh
(только [
, который более неуклюж и ограничен).sh
не имеет массивов.local
, source
, function
, shopt
, let
, declare
и select
, не являются переносимыми для sh
. (Некоторые реализации sh
поддерживают, например, local
.)for((i=0;i<=3;i++))
с тремя аргументами, присваивание инкремента +=
и т.д. Функция $'string\nwith\tC\aescapes'
ориентировочно принята для POSIX, но пока не поддерживается в системах которые придерживаются только текущей спецификации POSIX.<<<'here strings'
.*.{png,jpg}
и {0..12}
.~
относится к $HOME
только в Bash (и, в более общем случае, ~username
- к домашнему каталогу username
)./bin/sh
.<(cmd)
и >(cmd)
.&|
для 2>&1 |
и &>
для > ... 2>&1
<>
.${substring:1:2}
, ${variable/pattern/replacement}
, преобразование регистра и т.д.$[expression]
, который, однако, должен быть заменен арифметическим синтаксисом POSIX $((expression))
. (Однако некоторые устаревшие реализации до POSIX sh
могут не поддерживать это.)$RANDOM
, $SECONDS
, $PIPESTATUS[@]
и $FUNCNAME
, являются расширениями Bash.export variable=value
и [ "x" == "y" ]
, которые не являются переносимыми (export variable
должны быть отделены от присвоения переменной, а для сравнения переносимых строк в [ ... ]
используется один знак равенства).Помните, это сокращенный список. Обратитесь к справочному руководству для полного совка, и 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
или варианты, такие как Фамильная реликвия 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 Функция может быть выполнена только с помощью функции 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.
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
.
Аналогия:
ТЕРМИНАЛ
SHELL
SH Vs. BASH
SH
BASH
СПРАВОЧНЫЙ МАТЕРИАЛ:
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.
В других ответах обычно указывалось различие между Bash и стандартом оболочки POSIX. Однако при написании переносимых сценариев оболочки и использовании синтаксиса Bash список типичных базизмов и соответствующих чистых решений POSIX очень удобен. Такой список был скомпилирован, когда Ubuntu переключился с Bash на Dash в качестве системной оболочки по умолчанию и может быть найден здесь: https://wiki.ubuntu.com/DashAsBinSh
Кроме того, есть отличный инструмент под названием checkbashisms, который проверяет bashisms в вашем script и подходит, когда вы хотите убедиться, что ваш script переносится.
/bin/sh
может вызвать или не вызывать ту же программу, что и /bin/bash
.
sh
поддерживает по крайней мере функции требуемые POSIX (при условии правильной реализации). Он также может поддерживать расширения.
bash
, "Bourne Again Shell", реализует функции, необходимые для sh + bash -специфических расширений. Полный набор расширений слишком длинный для описания здесь, и он отличается от новых выпусков. Различия описаны в руководстве bash. Введите info bash
и прочитайте раздел "Bash Возможности" (раздел 6 в текущей версии) или прочитайте текущую документацию .
Bash (bash) - одна из многих доступных (но наиболее часто используемых) оболочек Unix. Bash означает "Bourne Again SHell" и является заменой/улучшением оригинальной оболочки Bourne (sh).
Shell scripting работает с скриптами в любой оболочке, тогда как сценарий Bash написан скриптом специально для Bash.
Вы можете увидеть POSIX стандарт для 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, когда это не обязательно.
sh
(более или менее) является подмножеством bash
.
sh
происходит от POSIX (P ortable O perating S ystem I Iterface), который нацелен на объединение Unix/Linux через общий язык и т.д. Этот общий переносимый язык - sh
, и он стандартизирован IEEE и доступен на любой машине linux/unix (также называемой "POSIX-совместимой").
bash
немного новее, чем sh
, и стремится быть POSIX-совместимым (поэтому он предназначен для запуска большинства сценариев sh
) и доступен почти на всех машинах linux/unix и обычно используется по умолчанию.
Операционная система 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 без изменений и также предоставлять функции редактирования строк команд.