Bash — это оболочка и командный язык Unix , написанный Брайаном Фоксом для проекта GNU в качестве бесплатной программной замены оболочки Bourne . [15] [16] Название оболочки является аббревиатурой от Bourne-Again SHell , игры слов в названии оболочки Bourne, которое она заменяет [17] и понятии « рождения заново ». [18] [19] Впервые выпущенная в 1989 году, [20] она использовалась в качестве оболочки входа по умолчанию для большинства дистрибутивов Linux и была одной из первых программ, портированных Линусом Торвальдсом на Linux, наряду с GCC . [21] Он доступен практически во всех современных операционных системах.
Bash — это командный процессор , который обычно работает в текстовом окне , где пользователь вводит команды, вызывающие действия. Bash также может читать и выполнять команды из файла, называемого скриптом оболочки . Как и большинство оболочек Unix, он поддерживает подстановку имен файлов (сопоставление с подстановочными знаками), конвейеризацию , здесь документы , подстановку команд , переменные и структуры управления для проверки условий и итерации . Ключевые слова , синтаксис , переменные с динамической областью действия и другие основные функции языка скопированы из sh . Другие функции, например, история , копируются из csh и ksh . Bash — это POSIX -совместимая оболочка, но с рядом расширений.
Версия также доступна для Windows 10 и Windows 11 через подсистему Windows для Linux . [22] [23] Это также пользовательская оболочка по умолчанию в Solaris 11. [24] Bash также была оболочкой по умолчанию в BeOS , [7] и в версиях Apple macOS от 10.3 (первоначально оболочкой по умолчанию была tcsh ) до 10.15 ( macOS Catalina ), в которой оболочка по умолчанию изменена на zsh , [25] хотя Bash остается доступным в качестве альтернативной оболочки. [26]
Дыра в безопасности Bash, датируемая версией 1.03 (август 1989 года), [27] получившая название Shellshock , была обнаружена в начале сентября 2014 года и быстро привела к целому ряду атак в Интернете . [28] [29] [30] Патчи для исправления ошибок стали доступны вскоре после того, как ошибки были обнаружены.
Брайан Фокс начал программировать Bash 10 января 1988 года, [31] после того, как Ричард Столлман был недоволен отсутствием прогресса, достигнутого предыдущим разработчиком. [15] Столлман и Фонд свободного программного обеспечения (FSF) рассматривали свободную оболочку, которая могла бы запускать существующие сценарии оболочки, настолько стратегически важную для полностью свободной системы, построенной из кода BSD и GNU, что это был один из немногих проектов, которые они финансировали сами, а Fox взял на себя обязательство работа в качестве сотрудника ФСФ. [15] [32] Фокс выпустил бета-версию Bash, версию .99, 8 июня 1989 года, [20] и оставался основным сопровождающим до середины 1992 года [33] и середины 1994 года, [34] когда он был уволен из FSF [35] , и его ответственность была передана другому одному из первых участников, Чету Рэми. [36] [37] [38]
С тех пор Bash стала самой популярной оболочкой среди пользователей Linux, став интерактивной оболочкой по умолчанию в различных дистрибутивах этой операционной системы [39] [40] (хотя оболочка Almquist может быть оболочкой сценариев по умолчанию) и в выпусках Apple macOS. до Catalina в октябре 2019 года. [41] [42] [25] Bash также был портирован на Microsoft Windows и распространялся с Cygwin и MinGW , на DOS проектом DJGPP , на Novell NetWare , на OpenVMS проектом GNV, [43 ] в ArcaOS , [44] и в Android через различные приложения эмуляции терминала.
В сентябре 2014 года Стефан Шазелас, специалист по Unix/Linux, [45] обнаружил ошибку безопасности в программе. Ошибка, впервые обнаруженная 24 сентября, получила название Shellshock и получила номера CVE — 2014-6271, CVE-2014-6277 и CVE-2014-7169. Ошибка была расценена как серьезная, поскольку CGI- скрипты, использующие Bash, могли быть уязвимыми, делая возможным выполнение произвольного кода . Ошибка была связана с тем, как Bash передает определения функций подоболочкам через переменные среды . [46]
Синтаксис команд Bash является расширенным набором синтаксиса команд оболочки Bourne. Bash поддерживает расширение фигурных скобок , [47] завершение командной строки (программируемое завершение), [48] базовую отладку [49] [50] и обработку сигналов (с использованием trap
), начиная с bash 2.05a [51] [52] среди других функций. Bash может выполнять подавляющее большинство сценариев оболочки Bourne без изменений, за исключением сценариев оболочки Bourne, которые спотыкаются о пограничном синтаксическом поведении, интерпретируемом по-разному в Bash, или пытаются запустить системную команду, соответствующую более новой встроенной функции Bash, и т. д. Синтаксис команд Bash включает в себя нарисованные идеи. из Korn Shell (ksh) и оболочки C (csh), такие как редактирование командной строки, история команд ( history
command), [53] стек каталогов, переменные $RANDOM
и и синтаксис подстановки команд$PPID
POSIX .$(…)
Когда пользователь нажимает клавишу табуляции в интерактивной командной оболочке, Bash автоматически использует завершение командной строки , начиная с бета-версии 2.04, [54] для сопоставления частично типизированных имен программ, имен файлов и имен переменных. Система завершения командной строки Bash очень гибка и настраиваема и часто включает в себя функции, которые дополняют аргументы и имена файлов для конкретных программ и задач.
Синтаксис Bash имеет множество расширений, которых нет в оболочке Bourne. Bash может выполнять целочисленные вычисления («арифметические вычисления») без запуска внешних процессов. Для этой цели он использует ((…))
команду и $((…))
синтаксис переменных. Его синтаксис упрощает перенаправление ввода-вывода . Например, он может одновременно перенаправить стандартный вывод (stdout) и стандартную ошибку&>
(stderr) с помощью оператора. Это проще вводить, чем эквивалент оболочки Bourne ' command > file 2>&1
'. Bash поддерживает замену процессов с использованием синтаксиса <(command)
and >(command)
, который заменяет вывод (или ввод) команды там, где обычно используется имя файла. (Это реализуется через безымянные каналы /proc/fd/ в системах, которые это поддерживают, или через временные именованные каналы, где это необходимо).
При использовании ключевого слова «функция» объявления функций Bash несовместимы со сценариями Bourne/Korn/POSIX (у KornShell возникает та же проблема при использовании «функции»), но Bash принимает тот же синтаксис объявления функций, что и оболочки Bourne и Korn. и является POSIX-совместимым. Из-за этих и других различий сценарии оболочки Bash редко выполняются под интерпретаторами оболочки Bourne или Korn, если только они не написаны намеренно с учетом этой совместимости, которая становится все менее распространенной по мере того, как Linux становится все более распространенным. Но в режиме POSIX Bash более точно соответствует POSIX. [55]
Bash поддерживает здесь документы . Начиная с версии 2.05b Bash может перенаправлять стандартный ввод (stdin) из «здесь строки» с помощью <<<
оператора.
Bash 3.0 поддерживает сопоставление регулярных выражений внутри процесса, используя синтаксис, напоминающий Perl . [56]
В феврале 2009 года [57] в Bash 4.0 появилась поддержка ассоциативных массивов . [13] Индексы ассоциативного массива представляют собой строки, аналогично AWK или Tcl . [58] Их можно использовать для эмуляции многомерных массивов. Bash 4 также меняет свою лицензию на GPL-3.0 или более позднюю версию ; некоторые пользователи подозревают, что это изменение лицензии является причиной того, что MacOS продолжает использовать более старые версии. [59] Apple окончательно прекратила использовать Bash в своих операционных системах в качестве оболочки по умолчанию с выпуском MacOS Catalina в 2019 году. [26]
Расширение скобок, также называемое чередованием , — это функция, скопированная из оболочки C. Он генерирует набор альтернативных комбинаций. Сгенерированные результаты не обязательно должны существовать в виде файлов. Результаты каждой развернутой строки не сортируются, и сохраняется порядок слева направо:
$ echo a { p,c,d,b } e ape ace ade abe $ echo { a,b,c }{ d,e,f } ad ae af bd be bf cd ce cf
Пользователям не следует использовать расширения фигурных скобок в переносимых сценариях оболочки, поскольку оболочка Bourne не выдает такой же результат.
$ # оболочка bash $ /bin/bash -c 'echo a{p,c,d,b}e' ape ace ade abe $ # Традиционная оболочка не выдает тот же результат $ /bin/sh -c 'echo a {p,c,d,b}e' a{p,c,d,b}e
Когда раскрытие фигурных скобок сочетается с подстановочными знаками, сначала раскрываются фигурные скобки, а затем полученные подстановочные знаки заменяются обычным способом. Следовательно, список изображений JPEG и PNG в текущем каталоге можно получить, используя:
лс *. { jpg,jpeg,png } # расширяется до *.jpg *.jpeg *.png - после чего # подстановочные знаки обрабатываются echo *. { png,jp { e, } g } # echo просто показывает расширения - # и возможны фигурные скобки.
Помимо чередования, раскрытие фигурных скобок можно использовать для последовательных диапазонов между двумя целыми числами или символами, разделенными двойными точками. Более новые версии Bash позволяют использовать третье целое число для указания приращения.
$ echo { 1 ..10 } 1 2 3 4 5 6 7 8 9 10 $ echo { 01 ..10 } 01 02 03 04 05 06 07 08 09 10 $ echo file { 1 ..4 } .txt file1.txt file2.txt file3.txt file4.txt $ echo { a..e } abcde $ echo { 1 ..10..3 } 1 4 7 10 $ echo { a..j..3 } adgj
Когда раскрытие фигурных скобок сочетается с раскрытием переменных ( расширение параметров АКА и подстановка параметров ), раскрытие переменных выполняется после раскрытия фигурных скобок, что в некоторых случаях может потребовать использования eval
встроенных функций, например:
$ начало = 1 ; end = 10 $ echo { $start .. $end } # не удается расширить из-за порядка вычисления {1..10} $ eval echo { $start .. $end } # происходит расширение переменной, затем оценивается результирующая строка 1 2 3 4 5 6 7 8 9 10
Когда Bash запускается, он выполняет команды в различных точечных файлах . В отличие от сценариев оболочки Bash, точечные файлы обычно не имеют ни разрешения на выполнение, ни директивы интерпретатора, такой как #!/bin/bash
.
Приведенный ниже пример ~/.bash_profile
совместим с оболочкой Bourne и дает семантику, аналогичную csh для ~/.bashrc
и ~/.bash_login
. Это короткая оценка , которая проверяет, существует ли имя файла и доступно ли оно для чтения, пропуская часть после, если это не так.[ -r filename ] && cmd
&&
[ -r ~/.profile ] && . ~/.profile # настройка среды один раз, синтаксис Bourne-sh только если [ -n " $PS1 " ] ; тогда # мы интерактивны? [ -r ~/.bashrc ] && . ~/.bashrc # настройка tty/prompt/function для интерактивных оболочек [ -r ~/.bash_login ] && . ~/.bash_login # любые задачи при входе в систему, только для оболочки входа fi # Конец блока «if»
Некоторые версии Unix и Linux содержат сценарии запуска системы Bash, обычно находящиеся в /etc
каталоге. Bash выполняет эти файлы как часть стандартной инициализации, но другие файлы запуска могут читать их в другом порядке, чем документированная последовательность запуска Bash. Содержимое файлов root-пользователя по умолчанию также может иметь проблемы, а также файлы скелета, которые система предоставляет новым учетным записям пользователей при настройке. Сценарии запуска, запускающие систему X Window, также могут делать неожиданные вещи со сценариями запуска Bash пользователя, пытаясь настроить переменные пользовательской среды перед запуском оконного менеджера . Эти проблемы часто можно решить с помощью файла ~/.xsession
или ~/.xprofile
для чтения ~/.profile
— который предоставляет переменные среды, которые окна оболочки Bash порождают из оконного менеджера, такие как xterm или Gnome Terminal .
Вызов Bash с --posix
опцией или указание set -o posix
в сценарии приводит к тому, что Bash очень близко соответствует стандарту POSIX 1003.2 . [60] Сценарии оболочки Bash, предназначенные для переносимости , должны учитывать как минимум стандарт оболочки POSIX. Некоторые функции bash, которых нет в POSIX: [60] [61]
[[ ... ]]
и ее сопоставление с регулярными выражениями(( ... ))
; $(( ... ))
является POSIX)local
для переменных с ограниченной областью действияЕсли часть кода использует такую возможность, это называется «башизм» — проблема для портативного использования. Debian checkbashisms
и Vidar Holen shellcheck
можно использовать, чтобы убедиться, что сценарий не содержит этих частей. [63] [64] Список варьируется в зависимости от фактической целевой оболочки: политика Debian разрешает некоторые расширения в их сценариях (например, в оболочке Dash ), [61] в то время как сценарий предназначен для поддержки оболочек Bourne до POSIX, например autoconfconfigure
еще более ограничены в возможностях, которые они могут использовать . [65]
Bash использует GNU Readline для предоставления сочетаний клавиш для редактирования командной строки с использованием привязок клавиш по умолчанию ( Emacs ). Привязки Vi можно включить, запустив set -o vi
. [66]
Оболочка Bash имеет два режима выполнения команд: пакетный (асинхронный) и параллельный (синхронный).
Для выполнения команд в пакетном режиме (т.е. последовательно) их необходимо разделить символом «;» или выделить в отдельные строки:
команда1 ; команда2команда3
В этом примере, когда команда1 завершается, выполняется команда2, а когда команда2 завершается, выполняется команда3.
Фоновое выполнение команды 1 может произойти с использованием (символа &) в конце команды выполнения, и процесс будет выполняться в фоновом режиме с немедленным возвратом управления оболочке и разрешением продолжения выполнения команд.
команда1 &
Или, чтобы одновременно выполнить две команды Command1 и Command2, они должны быть выполнены в оболочке Bash следующим образом:
команда1 и команда2
В этом случае команда1 выполняется в фоновом режиме и символе, немедленно возвращая управление оболочке, которая выполняет команду2 на переднем плане.
Процесс можно остановить и вернуть управление в bash, набрав Ctrl+ z, пока процесс выполняется на переднем плане. [67]
Список всех процессов, как фоновых, так и остановленных, можно получить, запустив jobs
:
$ jobs [1] — Выполнение команды 1 и [2] + Остановка команды 2
В выводе число в скобках относится к идентификатору задания. Знак плюс означает процесс по умолчанию для bg
и fg
. Тексты «Выполняется» и «Остановлен» относятся к состоянию процесса . Последняя строка — это команда, запустившая процесс.
Состояние процесса можно изменить с помощью различных команд. Команда fg
переводит процесс на передний план и bg
устанавливает остановленный процесс в фоновом режиме. bg
и fg
может принять идентификатор задания в качестве первого аргумента, чтобы указать процесс, над которым нужно действовать. Без него используется процесс по умолчанию, обозначенный знаком плюс в выходных данных jobs
. Эту kill
команду можно использовать для преждевременного завершения процесса, отправив ему сигнал . Идентификатор задания необходимо указывать после знака процента:
убить %1
Bash предоставляет разделители команд «условного выполнения», которые ставят выполнение команды в зависимость от кода завершения , установленного предшествующей командой. Например:
cd " $ГДЕ-ТО " && ./do_something || echo «Произошла ошибка» > & 2
Где ./do_something выполняется только в том случае, если команда cd (изменить каталог) была «успешной» (возвращала нулевой статус выхода), а команда echo будет выполняться только в том случае, если команда cd или ./do_something возвращает «ошибку». (ненулевой статус выхода).
Для всех команд статус завершения сохраняется в специальной переменной $?
. Bash также поддерживает и формирует условную оценку команд.if ...;then ...;else ...;fi
case $VARIABLE in $pattern)...;;$other_pattern)...;; esac
Внешняя команда bashbug сообщает об ошибках оболочки Bash. Когда команда вызывается, она открывает редактор по умолчанию пользователя с формой для заполнения. Форма отправляется по почте сопровождающим Bash (или, при необходимости, на другие адреса электронной почты). [68] [69]
Bash поддерживает программируемое завершение с помощью встроенных команд complete
, compopt
и compgen
. [70] Эта функция доступна с бета-версии 2.04, выпущенной в 2000 году. [71] [72] Эти команды обеспечивают сложную и интеллектуальную спецификацию завершения для команд (т.е. установленных программ), функций, переменных и имен файлов. [73]
Две команды complete
и compopt
определяют, как аргументы некоторых доступных команд или опций будут перечислены во входных данных readline . Начиная с версии 5.1 завершение команды или опции обычно активируется нажатием клавиши после ввода ее имени. [73]Tab ↹
Название программы представляет собой фигуру речи или остроту , которая начинается с уважения к Стивену Борну , создателю одной из программ оболочки, которую иногда считали замененной оболочкой bash. Его имя используется как каламбур на образе родов, и к этому каламбуру добавляется намек на христианскую идиому «рождения свыше » или, возможно, на буддийскую идею реинкарнации . Мерриам-Вебстер , который иногда рассматривается как отсылка к 3-й главе христианского Нового Завета , Мерриам-Вебстер определяет «рожденного свыше» как «человека, принявшего обновленное… обязательство веры». [74] Эта идиома затем используется для обозначения программа: Bourne Again SHell . [75] [76]
Акронимом этого названия является « bash», слово, означающее «сильно ударить » . [ 77] некоторое разочарование . Подобные образы негативной эмоциональности можно рассматривать как прямо противоречащие идее «рождения свыше».
Такое наименование можно считать примером словесной иронии или случайной инсинуации . Грамматика Bash изначально была основана на грамматиках наиболее популярных программ оболочки Unix, используемых в то время, некоторые из которых в то время считались особенно трудными в использовании или разочаровывающими . С течением времени разработка bash сделала грамматику более удобной для пользователя, [78] [79] [80] [81] [82] [83] настолько, что кажется вероятным, что проект bash был направлен на улучшение это удобство использования. С тех пор bash стал де-факто программой оболочки по умолчанию в большинстве операционных систем Linux и Unix.
Страница руководства Linux задумана как контролирующий и авторитетный исходный документ для понимания того, как работает bash, а руководство GNU более удобно для чтения. «Вы также можете найти информацию о Bash, запустив info bash... или просмотрев /usr/share/doc/bash/
, /usr/local/share/doc/bash/
или аналогичные каталоги в вашей системе. Краткую сводку можно получить, запустив bash --help. [84] » «У сопровождающего также есть страница Bash, на которой есть часто задаваемые вопросы Вопросы. [85] «Как стандарт, на котором основан bash, POSIX.1-2017 также очень информативен. Информацию о встроенных командах оболочки можно найти, выполнив их help
или help [builtin name]
в командной строке терминала, где установлен bash.
Bash — это бесплатное программное обеспечение, распространяемое на условиях Стандартной общественной лицензии [GNU], опубликованной Фондом свободного программного обеспечения, версия 3 лицензии (или любой более поздней версии).
См. test.c для GPL-2.0 или более поздней версии.
В течение полутора лет оболочка GNU была «почти готова». Автор неоднократно давал обещания выполнить то, что он сделал, но так и не сдержал их. В конце концов я больше не мог поверить, что он когда-нибудь что-нибудь доставит. Итак, сотрудник Фонда Брайан Фокс сейчас реализует имитацию оболочки Bourne.
Когда Ричард Столлман решил Чтобы создать полную замену тогдашним обремененным системам Unix, он знал, что в конечном итоге ему придется заменить все распространенные утилиты, особенно стандартную оболочку, и эти замены должны будут иметь приемлемую лицензию.Исходная ссылка на компьютерный мир.com.au не работает: см. также копии оригинального материала на сайтах readthedocs.io, Computerworld.com.au и Университета Южной Каролины.
«Bourne Again Shell» — это игра от имени Bourne Shell , которое было обычной оболочкой в Unix.
Название представляет собой каламбур от названия оболочки Bourne (sh), ранний вариант и важная оболочка Unix, написанная Стивеном Борном и распространявшаяся вместе с версией 7 Unix примерно в 1978 году, а также концепция «рождения заново».
В настоящее время я портировал bash(1.08) и gcc(1.40), и, похоже, все работает.
Дата рождения: воскресенье, 10 января 1988 г. Первоначальный автор: Брайан Фокс
Сотрудники Фонда свободного программного обеспечения написали и поддерживают ряд программных пакетов GNU. Двумя примечательными из них являются библиотека C и оболочка. … Мы финансировали разработку этих программ, потому что проект GNU касался не только инструментов или среды разработки. Нашей целью была полноценная операционная система, и для этой цели были необходимы эти программы.
В Linux большинство пользователей используют bash, потому что это самая популярная оболочка.
Оболочка Bourne Again (bash) — наиболее распространенная оболочка, устанавливаемая в дистрибутивах Linux.
Bash на сегодняшний день является самой популярной оболочкой и является оболочкой по умолчанию в системах Linux и Mac OSX.