Сценарии bash - это то же самое, что сценарии оболочки?

58

Я очень новичок в Ubuntu. Я слышал, как люди говорят «сценарии оболочки», «сценарии bash».

Интересно, они такие же? Или они разные?

Бэтмен
источник
Есть полезный ответ на SO
г-н Пей

Ответы:

55

Bash ( bash) - одна из многих доступных (но наиболее часто используемых) оболочек Unix. Bash расшифровывается как « B ourne A gain SH ell» и является заменой / улучшением оригинальной оболочки Bourne ( sh).

Сценарии оболочки - это сценарии в любой оболочке, тогда как сценарии Bash - сценарии специально для Bash. Однако на практике «сценарий оболочки» и «сценарий bash» часто используются взаимозаменяемо, если речь не идет о Bash.

РЕДАКТИРОВАТЬ: На самом деле, оболочка сценариев по умолчанию в Ubuntu - это dash, а интерактивная оболочка по умолчанию (что вы получаете, если вы открываете терминал) - Bash. Тем не менее, эти два термина по-прежнему в основном взаимозаменяемы.

Хилтон Шамуэй
источник
1
Что определяет dash как оболочку сценариев по умолчанию?
17
1
@wjandrea Тот факт, что /bin/shсимволическая ссылка /bin/dashделает системную оболочку по умолчанию , но не является оболочкой сценариев по умолчанию , т. е. нет письменного правила, которое вам абсолютно необходимо использовать /bin/sh. Когда вы используете /bin/shего, это в основном из соображений переносимости, когда вы ожидаете, что ваш скрипт будет использоваться на нескольких Unix-подобных платформах ОС, большинство из которых имеют /bin/shPOSIX-совместимую оболочку семейства Bourne.
Сергей Колодяжный,
29

Введение

Сценарии оболочки и Bashсценарии - это не одно и то же, поскольку существуют другие оболочки, shкоторые можно использовать для выполнения сценария; сценарий, предназначенный для выполнения, Bashдолжен быть помечен как Bashсценарий. Эти термины часто используются взаимозаменяемо, поскольку Bashих расширенные функциональные возможности по сравнению с shнаиболее часто используются для выполнения пользовательских сценариев во многих дистрибутивах. Тем не менее, существуют и другие оболочки , такие как Korn (ksh), C shell (csh)и Z shell (zsh), но мы не будем вдаваться в них здесь , как обсуждение shи bashимеет самое непосредственное отношение к Ubuntu. Большая статья IBM здесь идет более подробно об эволюции оболочек в Linux и хорошо описывает архитектуру оболочки и как снаряды отличаются.

Сценарии оболочки

Shбыла оригинальная оболочка Unix, разработанная Стивеном Борном; однако системы на основе Debian и Ubuntu считают dashих shоболочкой ( shна самом деле это символическая ссылка dash). В Debian и Ubuntu из-за скорости shон чаще используется для критических системных процедур и для выполнения ключевых сценариев при запуске; для более подробной информации смотрите вики Ubuntu . Bashрасшифровывается как Bourne Again SHell и был разработан позже Брайаном Фоксом и значительно расширил оригинал sh. Разработка Fox и других Bashбыла важной частью проекта GNU. Смотрите это великое обсуждение истории Bashдля получения дополнительной информации.

Важно отметить, что оба shи Bash, как используется в Ubuntu и других дистрибутивах, являются POSIXсовместимыми, что означает, что они подписаны на ряд стандартов о том, как команды выполняются в командной консоли. Это делается для того, чтобы результаты сценариев, используемых в ОС, можно было надежно прогнозировать и чтобы поведение оболочки можно было поддерживать в этих POSIXпараметрах, что особенно важно для разработчиков. Для получения дополнительной информации о стандартах см. Официальную документацию .

Часто сценарии оболочки имеют суффикс .sh, даже если они предназначены для выполнения в виде bashсценариев и располагаются #!/bin/bashв верхней части сценария. На самом деле не имеет значения, называется ли скрипт script.sh или my.script , имеет значение, является ли вызов интерпретатором /bin/shили /bin/bash. Сценарии командной оболочки также могут быть вызваны из командной строки либо с shили bash.

Однако важно отметить, что результаты могут отличаться в зависимости от того, какой интерпретатор вызывается, поскольку не все bashкоманды будут работать sh, тогда как большинство shкоманд будут работать в bash. В целом, большинство пользователей захотят использовать /bin/bashдля своих сценариев, чтобы они могли воспользоваться расширенным набором функций; системные скрипты могут быть выполнены с помощью, /bin/shесли это требуется.

Ресурсы для сценариев Bash Shell

Иногда трудно найти полезные ресурсы в Интернете, которые следуют хорошей практике и дают советы, которые позволят вам создавать полезные сценарии. После man bash, некоторые из наиболее важных ресурсов - это вики Грега , хакеры Bash и недавняя книга Стива Паркера о скриптах в Shell, которая в основном посвящена Bashи опубликована О'Рейли. Хорошее введение также предпринято Руководством новичка Bash .


источник
2
Этот ответ на самом деле превосходит мой (принятый ответ), мой только что пришел за неделю до этого.
Хилтон Шамуэй
4

Есть несколько оболочек , доступных для Ubuntu, как bash, zsh, ksh, tcshи csh.

Поэтому, когда кто-то говорит « Шелл» , он говорит об одном из них. Однако эти снаряды немного отличаются друг от друга. Таким образом, когда кто-то говорит о bashсценариях, он использует оболочку, но когда кто-то говорит о сценариях оболочки, он сам по себе не использует bash. Но, как bashэто обычно используется в сценариях для Ubuntu, он обычно так и есть. Более того, разные оболочки одинаковы во многих аспектах, поэтому обычно это не имеет значения.

fromnaboo
источник
2
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr  3 08:58 /bin/bash*

Это показывает, что 'sh' является символической ссылкой на 'dash', и что / bin / bash, которая является интерактивной оболочкой по умолчанию в Ubuntu, является исполняемым файлом, который почти в 9 раз больше, чем / bin / sh.

Действительно, «man sh» (1590 строк) против «man bash» (5459 строк) показывает, что bash является большой надмножеством традиционного «sh».

Узнайте больше здесь:

arielf
источник
2

Сценарий оболочки будет определен как ориентированный на переносимость сценарий, который может запускаться системной оболочкой POSIX-совместимых ОС. Синтаксис будет идентичным или похожим на синтаксис языка сценариев оболочки, определенный стандартом POSIX. Это стандарт для большинства POSIX-совместимых ОС, таких как Linux / Unix / * BSD и т. Д. POSIX является наиболее распространенной основой для совместимости между операционными системами.

Различные ОС из вышеупомянутого реализуют различные оболочки для неинтерактивного использования (то есть для выполнения системных сценариев или сценариев, использующих #! /bin/shshebang), которые помимо реализации команд и синтаксиса POSIX имеют свои собственные расширения или могут быть исключены из некоторых менее полезных функций по соображениям производительности, но основа POSIX обеспечивает очень высокий уровень переносимости сценариев, разработанных для различных POSIX-совместимых Oss.

Большинство вышеупомянутых ОС имеют отдельную интерактивную оболочку, которая обычно представляет собой полнофункциональную bash . Bash в значительной степени совместим с POSIX, но также имеет большой пул дополнительных команд и поддерживает другой синтаксис. Запуск Bash с параметром командной строки --posix или выполнение set -o posix во время работы Bash приведут к тому, что Bash будет более точно соответствовать стандарту POSIX, изменив поведение, чтобы оно соответствовало заданному POSIX в тех областях, где Bash используется по умолчанию. отличается, см .: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html.

Спецификатор Shebang и унифицированные пути для исполняемых файлов оболочки в Unix-подобных ОС

Благодаря единым правилам размещения исполняемых файлов для оболочек (они обычно находятся в каталоге / bin /), мы можем иметь единые правила для создания сценариев оболочки, более конкретно, нам ясно, какой путь поместить в выражение shebang, чтобы указать на правильный исполняемый файл оболочки для запуска скрипта. Файловые системы Unix / Linux / * BSD по своей природе не поддерживают расширения, поэтому расширения файлов служат только в качестве дополнительной подсказки или для целей индексации.

В частности, в Debian / Ubuntu bin/sh- это символическая ссылка, указывающая на bin/dashисполняемый файл оболочки dash . Это делает dash системной оболочкой, которая, по оценкам, в 4 раза быстрее и имеет размер ~ 1/10, чем более функциональная bash. источник: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash

Debian / Ubuntu интерактивный терминал по умолчанию, как и во многих других Unix-подобных операционных систем, Баш, для которых путь также равномерная: /bin/bash.

Стандарт POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html

Общее правило будет:

Если команда или параметр не определены в POSIX, не ставьте их в #! /bin/shсценарий.

Преобразуйте ваш скрипт или проверьте на ошибки

Для преобразования вашего скрипта из bash в форму POSIX вы можете автоматически проверить наличие ошибок в вашем скрипте оболочки или посмотреть, какие изменения в вашем скрипте bash вы должны сделать, чтобы сделать его POSIX-совместимым:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism

Ола
источник
1
Довольно хороший ответ, +1. Добро пожаловать в AskUbuntu!
Сергей Колодяжный
1
Что касается Dash как / bin / sh в Ubuntu, то есть статья, которую вы также можете привести. А еще есть askubuntu.com/q/976485/295286
Сергей Колодяжный