Как правило, все 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могут даже не существовать):
Современные системы 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может быть символическая ссылка или жесткая ссылка. Если это символическая ссылка, портативный способ решить это:
На самом деле -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. :-)
TL; DR : bashэто расширенный набор shс более элегантным синтаксисом и большей функциональностью. Безопасно использовать линию bash-shebang почти во всех случаях, поскольку она довольно распространена на современных платформах.
NB: в некоторых средах shестьbash . Проверьте sh --version.
Поскольку 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).
[[недоступен в 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
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», так и «Bash - это подкласс sh», не являются ли они противоположными утверждениями? Можете ли вы уточнить?
Киртана Прабхакаран
11
Я думаю, что это попытка сказать, что Bash наследуется от sh(так что это «подкласс» в смысле ООП) и расширяет его (как и расширенный набор функций).
В приведенной ниже таблице перечислены большинство функций, которые, я думаю, заставят вас выбрать одну оболочку над другой. Он не предназначен для того, чтобы быть окончательным списком и не включает в себя все возможные функции для каждой возможной оболочки. Считается, что компонент находится в оболочке, только если он находится в версии, поставляемой с операционной системой, или если он доступен как скомпилированный непосредственно из стандартного дистрибутива. В частности, оболочка 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
ViCommand line editing N N Y Y Y(3) Y L L
EmacsCommand line editing N N Y Y Y Y L L
RebindableCommand 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
MhMailbox completion N N N N(4) N(6) N(6) N N
CoProcesses 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
CustomPrompt(easily) N N Y Y Y Y Y Y
SunKeyboardHack N N N N N Y N N
SpellingCorrection N N N N Y Y N N
ProcessSubstitution N N N Y(2) N Y Y Y
UnderlyingSyntax sh csh sh sh csh sh rc rc
FreelyAvailable N N N(5) Y Y Y Y Y
ChecksMailbox N Y Y Y Y Y F F
TtySanityChecking 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
ListVariables 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.TheVi 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.
Ваша таблица мне не нужна, так как она пытается сравнить возможности оболочки Bourne и функции из ksh до 1988 года. Если вы действительно создадите таблицу для 1988 года, вам нужно будет удалить большинство других оболочек из этой таблицы, включая bash , sh и rc. Не могли бы вы объяснить, откуда вы получили значения для вашей таблицы?
Щил
1
Позвольте мне дать несколько советов: Job Control был добавлен в оболочку Bourne в 1989 году, а оболочка Bourne была сделана OpenSource в 2005 году. Оболочка Korn имеет процесс подмены как минимум с 1988 года, а с 1997 года - OpenSource. Кстати, ваши заявления относительно $ ENV не верны, $ ENV только для чтения / выполнения для интерактивных оболочек.
@schily Если вы чувствуете, что это где-то неверно, пожалуйста, отредактируйте его соответствующим образом.
SriniV
8
Исходя из того, что разоблачено, может показаться, что было бы лучше удалить этот ответ, так как он по сути является мошенническим, а ОП на самом деле не проверял информацию, которую он вставил.
знаю
24
ТЕРМИНАЛ
программа (ы), которая поднимает окно
xterm, rxvt, konsole, kvt, gnome-терминал, nxterm и eterm.
РАКУШКА
Это программа, которая работает в терминале
Shell - это и интерпретатор команд, и язык программирования
Shell - это просто макропроцессор, который выполняет команды.
Макропроцессор означает функциональность, при которой текст и символы расширяются для создания больших выражений.
В своей основе оболочка - это просто макропроцессор, который выполняет команды. Термин « макропроцессор» означает функциональность, в которой текст и символы расширяются для создания больших выражений.
Оболочка Unix является и интерпретатором команд, и языком программирования.
В качестве интерпретатора команд оболочка предоставляет пользовательский интерфейс для богатого набора утилит GNU. Особенности языка программирования позволяют комбинировать эти утилиты. Файлы, содержащие команды, могут быть созданы и сами становятся командами. Эти новые команды имеют тот же статус, что и системные команды в каталогах, таких как / bin, что позволяет пользователям или группам создавать пользовательские среды для автоматизации их общих задач.
Оболочки могут использоваться в интерактивном или неинтерактивном режиме. В интерактивном режиме они принимают ввод, введенный с клавиатуры. При неинтерактивном выполнении командные оболочки выполняют команды чтения из файла.
Оболочка позволяет выполнять команды GNU как синхронно, так и асинхронно. Оболочка ожидает завершения синхронных команд, прежде чем принимать больше ввода; Асинхронные команды продолжают выполняться параллельно с оболочкой, пока она читает и выполняет дополнительные команды. Конструкции перенаправления позволяют детально контролировать ввод и вывод этих команд. Кроме того, оболочка позволяет контролировать содержимое командных сред.
Оболочки также предоставляют небольшой набор встроенных команд (встроенных функций), реализующих функциональные возможности, которые невозможно или неудобно получить с помощью отдельных утилит . Например, cd, break, continue и exec не могут быть реализованы вне оболочки, потому что они напрямую манипулируют самой оболочкой. Встроенные функции history, getopts, kill или pwd, среди прочего, могут быть реализованы в отдельных утилитах, но их удобнее использовать в качестве встроенных команд. Все встроенные функции оболочки описаны в последующих разделах.
Хотя выполнение команд необходимо, большая часть мощности (и сложности) оболочек обусловлена их встроенными языками программирования.
Как и любой язык высокого уровня, оболочка предоставляет переменные, конструкции управления потоком, цитирование и функции.
Оболочки предлагают функции, предназначенные специально для интерактивного использования, а не для расширения языка программирования. Эти интерактивные функции включают управление заданиями, редактирование командной строки, историю команд и псевдонимы. Каждая из этих функций описана в данном руководстве.
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 в вашем скрипте и оказывается полезным, когда вы хотите убедиться, что ваш скрипт переносим.
Это в основном то, к чему мой ответ на данный момент действительно сводится. +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, когда это не обязательно.
Различия настолько просты, насколько это возможно: после того, как вы поймете основы, другие комментарии, опубликованные выше, будет легче уловить.
Оболочка - «Shell» - это программа, которая облегчает взаимодействие пользователя и операционной системы (ядра). Доступно множество реализаций оболочки, таких как sh, bash, csh, zsh ... и т. Д.
Используя любую из программ оболочки, мы сможем выполнять команды, которые поддерживаются этой программой оболочки.
Bash - Это происходит от B ourne- в усиления Ш. ELL. Используя эту программу, мы сможем выполнить все команды, указанные Shell. Также мы сможем выполнить некоторые команды, специально добавленные в эту программу. Bash имеет обратную совместимость с sh.
Sh - это получено из Bourne Sh флигель. «sh» поддерживает все команды, указанные в оболочке. Значит, используя эту программу, мы сможем выполнить все команды, указанные Shell.
Я не пытаюсь понять 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 без модификации, а также предоставляет возможность редактирования командной строки.
Ответы:
Что такое ш
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
могут даже не существовать):sh
на которыеdash
по умолчанию установлены;initramfs
. Он используетash
реализацию оболочки.pdksh
, потомок оболочки Korn. FreeBSDsh
является потомком оригинальной оболочки UNIX Bourne. У Solaris есть свой собственный,sh
который долгое время не был POSIX-совместимым; бесплатная реализация доступна из проекта Heirloom .Как вы можете узнать, что
/bin/sh
указывает ваша система?Сложность в том, что это
/bin/sh
может быть символическая ссылка или жесткая ссылка. Если это символическая ссылка, портативный способ решить это:Если это жесткая ссылка, попробуйте
На самом деле
-L
флаг охватывает как символические, так и жесткие ссылки, но недостатком этого метода является то, что он не переносим - POSIX не требуетfind
поддержки-samefile
опции, хотя и GNU find, и FreeBSD find поддерживают ее.Линия Шебанг
В конечном счете, вам решать, какой из них использовать, написав строку «shebang» в качестве самой первой строки сценария.
Например
будет использовать
sh
(и все, что происходит, чтобы указать),будет использовать,
/bin/bash
если это доступно (и не с сообщением об ошибке, если это не так). Конечно, вы также можете указать другую реализацию, например,Какой использовать
Для моих собственных сценариев я предпочитаю
sh
по следующим причинам:bash
, они должны иметьsh
Есть и преимущества в использовании
bash
. Его особенности делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные и массивы. Plainsh
- очень минималистичный язык программирования.источник
bash
отображением пути, больше полезных сообщений об ошибках в случае синтаксической ошибки. Вы можете просто сэкономить время, используя bash.%
означает в начале вашей командной строки?$
вместо%
или#
для корневой оболочки.$
и#
...sh
существовал задолго до bash (что означает «bourne-again shell»). Но это было очень примитивно и не отвечало на терминальные события, какESC
персонажи. Затемksh
пришел (также до bash), затем bash начали те, кто любил идею лучшей оболочки, но ненавидел ksh. :-)sh
: http://man.cx/shbash
: http://man.cx/bashTL; 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
не имеет массивов.local
,source
,function
,shopt
,let
,declare
, иselect
не портативныйsh
. (Некоторыеsh
реализации поддерживают, напримерlocal
.)for((i=0;i<=3;i++))
цикл с тремя аргументами ,+=
присваивание инкремента и т. Д. Эта$'string\nwith\tC\aescapes'
функция предварительно принята для POSIX (это означает, что она работает в Bash сейчас, но пока не будет поддерживатьсяsh
в системах, которые придерживаются только текущего Спецификация POSIX, и, вероятно, не будет в течение некоторого времени, чтобы прийти).<<<'here strings'
.*.{png,jpg}
и{0..12}
скобка расширения.Это в POSIX, но может отсутствовать в некоторых реализациях до POSIX~
относится$HOME
только к Bash (и в целом~username
к домашнему каталогуusername
)./bin/sh
.<(cmd)
и>(cmd)
.&|
для удобного перенаправления в стиле Csh, например, для2>&1 |
и&>
для> ... 2>&1
<>
перенаправлением.${substring:1:2}
,${variable/pattern/replacement}
преобразование регистра и т. Д.$[expression]
синтаксис, который, однако, должен быть заменен арифметическим$((expression))
синтаксисом POSIX . (Некоторое наследие pre-POSIXsh
могут не поддерживать это.)$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
/ POSIXsh
или варианты, такие как Heirloomsh
источник
export variable=value
поручено POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Возможно, это недоступно в некоторых древних оболочках, но это определенно не башизм.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
Аналогия:
источник
sh
(так что это «подкласс» в смысле ООП) и расширяет его (как и расширенный набор функций).Пост из UNIX.COM
Особенности оболочки
В приведенной ниже таблице перечислены большинство функций, которые, я думаю, заставят вас выбрать одну оболочку над другой. Он не предназначен для того, чтобы быть окончательным списком и не включает в себя все возможные функции для каждой возможной оболочки. Считается, что компонент находится в оболочке, только если он находится в версии, поставляемой с операционной системой, или если он доступен как скомпилированный непосредственно из стандартного дистрибутива. В частности, оболочка C, указанная ниже, доступна в SUNOS 4. *, значительное количество поставщиков теперь поставляют либо tcsh, либо свои собственные улучшенные оболочки C (они не всегда дают понять, что поставляют tcsh.
Код:
Ключ к таблице выше.
Y Функция может быть выполнена с помощью этой оболочки.
N Функция отсутствует в оболочке.
F Функция может быть реализована только с использованием механизма функции оболочки.
L Библиотека readline должна быть связана с оболочкой, чтобы включить эту функцию.
Примечания к таблице выше
источник
ТЕРМИНАЛ
РАКУШКА
SH Vs. BASH
SH
BASH
СПРАВОЧНЫЙ МАТЕРИАЛ:
SHELL gnu.org:
BASH gnu.org:
источник
Другие ответы обычно указывают на разницу между 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
обычно делают это для обратной совместимости. Любая ОС Unix / Linux будет иметьsh
оболочку. На Ubuntush
часто вызывает,dash
а на MacOS это специальная версия POSIXbash
. Эти оболочки могут быть предпочтительными для соответствия стандарту поведения, скорости или обратной совместимости.bash
новее оригиналаsh
, добавляет больше возможностей и стремится к обратной совместимости сsh
. Теоретическиsh
программы должны работатьbash
.bash
доступно почти на всех машинах linux / unix и обычно используется по умолчанию - за заметным исключением MacOS по умолчанию сzsh
Catalina (10.15). FreeBSD по умолчанию не поставляется сbash
установленным.источник
sh
далеко предшествует POSIX. В наши дни вы надеетесь, что все, чтоsh
вы найдете, по крайней мере POSIX-совместимо; но в устаревших системах это ни в коем случае не является данностью. POSIX ставит гораздо больше, чем оболочка; на самом деле можно утверждать, что стандартизация вызовов операционной системы и библиотечных функций важнее./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.Баш и Ш - это две разные оболочки. В основном 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, когда это не обязательно.
источник
Различия настолько просты, насколько это возможно: после того, как вы поймете основы, другие комментарии, опубликованные выше, будет легче уловить.
Оболочка - «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
источник
Операционная система 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 без модификации, а также предоставляет возможность редактирования командной строки.
источник