Bash , сокращение от Bourne-Again SHell , — это командная программа и язык команд , поддерживаемый Free Software Foundation [2] и впервые разработанный для проекта GNU [3] Брайаном Фоксом . [4] Разработанный как 100% [5] свободное программное обеспечение, альтернативное оболочке Bourne , [6] [7] [8] он был первоначально выпущен в 1989 году. [9] Его название — игра слов, отсылающая как к его предшественнику, оболочке Bourne, [10] так и к концепции возрождения . [11] [12]
С момента своего создания Bash получил широкое распространение и обычно используется в качестве оболочки входа по умолчанию для многочисленных дистрибутивов Linux . Он имеет историческое значение как одна из самых ранних программ, портированных на Linux Линусом Торвальдсом , наряду с компилятором GNU ( GCC ). [13] Он доступен практически во всех современных операционных системах, что делает его универсальным инструментом в различных вычислительных средах.
Как командный процессор , Bash работает в текстовом окне , где пользователи вводят команды для выполнения различных задач. Он также поддерживает выполнение команд из файлов, известных как скрипты оболочки , что облегчает автоматизацию . В соответствии с соглашениями оболочки Unix , Bash включает в себя богатый набор функций. Ключевые слова , синтаксис , динамически определяемые переменные и другие основные функции языка скопированы из оболочки Bourne , sh
. Другие функции, например, история , скопированы из оболочки C , csh
, и оболочки Korn , ksh
. Bash — это POSIX -совместимая оболочка с рядом расширений.
Хотя Bash был разработан для UNIX и UNIX-подобных операционных систем, таких как GNU/Linux, [14] он также доступен для Windows, BeOS, [15] [16] и Haiku. [17]
Брайан Фокс начал писать код для Bash 10 января 1988 года [18] после того, как Ричард Столлман был недоволен отсутствием прогресса, достигнутым предыдущим разработчиком. [7] Столлман и FSF посчитали свободную оболочку, которая могла бы запускать существующие скрипты оболочки, настолько стратегически важной для полностью свободной системы, построенной на основе кода BSD и GNU, что это был один из немногих проектов, которые они финансировали сами, а Фокс взялся за эту работу как сотрудник FSF. [7] [19] Фокс выпустил Bash в виде бета-версии, версии .99, 8 июня 1989 года [9] и оставался основным сопровождающим до середины 1992 года [20] и середины 1994 года [21] , когда он был уволен из FSF [22] , и его обязанности были переданы другому раннему участнику, Чету Рэми. [23] [24] [25] [26] [27]
С тех пор Bash стал самой популярной оболочкой среди пользователей Linux, став интерактивной оболочкой по умолчанию в различных дистрибутивах этой операционной системы [28] [29] и в релизах macOS от Apple до Catalina в октябре 2019 года. [30] [31] [32] Bash также был портирован на Microsoft Windows [33] [34] и распространялся с Cygwin и MinGW , на DOS проектом DJGPP , на Novell NetWare , на OpenVMS проектом GNU, [35] на ArcaOS , [36] и на Android через различные приложения эмуляции терминала.
В сентябре 2014 года Стефан Шазелас, специалист по Unix/Linux, [37] обнаружил ошибку безопасности в программе. Ошибка, впервые обнаруженная 24 сентября, была названа Shellshock и ей были присвоены номера CVE - 2014-6271, CVE-2014-6277 и CVE-2014-7169. Ошибка была расценена как серьезная, поскольку CGI- скрипты, использующие Bash, могли быть уязвимы, что позволяло выполнять произвольный код . Ошибка была связана с тем, как Bash передает определения функций подоболочкам через переменные окружения . [38]
Как командный процессор , Bash работает в текстовом окне , где пользователи вводят команды для выполнения различных задач. Он также поддерживает выполнение команд из файлов, известных как скрипты оболочки , облегчая автоматизацию . В соответствии с соглашениями оболочки Unix , Bash включает в себя богатый набор функций, включая:
if
, case
, select
,&&
) и ИЛИ ( ||
), иfor
, while
, until
петли иfor ((
;[
, [[ ... ]]
, включая<
и >
;|
;( ... )
;trap
встроенных средств;job_spec &
;#
и:
Комментарии в стиле Томпсона с двоеточием;\
также допускается в конце строк.$'...'
иkernel{-headers}
,~
,$foo
или ${bar}
, включаяdeclare -A
, и${foo//x/y}
для sed 's/x/y/g'
,${bar##[a-zA-Z0-9]*}
для cut -c8-
,${!array[@]}
, и${var:?error message}
, среди прочего,$( ... )
,<()
или >()
, когда система это поддерживает:(( ... ))
или $(( ... ))
, включая*
, ?
, [...]
, и>
, и добавление, >>
,<<
,<<<
, которые позволяют использовать параметры в качестве входных данных, и>|
который может принудительно перезаписать файл, если в оболочке включена настройка «noclobber»;Bash также предлагает...
set
встроенные ) и параметры оболочки ( shopt
встроенные ), которые изменяют поведение оболочки;pushd
и popd
встроенные),help
команда,Ключевые слова , синтаксис , динамически определяемые переменные и другие основные функции языка скопированы из sh . Другие функции, например, история , скопированы из csh и ksh .
Синтаксис команд Bash является надмножеством синтаксиса команд оболочки Bourne. Bash поддерживает раскрытие фигурных скобок , [40] завершение командной строки (программируемое завершение), [41] базовую отладку [42] [43] и обработку сигналов (используя trap
) начиная с bash 2.05a [44] [45] среди других функций. Bash может выполнять подавляющее большинство сценариев оболочки Bourne без изменений, за исключением сценариев оболочки Bourne, которые сталкиваются с поведением синтаксиса fringe, интерпретируемым по-разному в Bash, или пытаются запустить системную команду, соответствующую более новой встроенной команде Bash, и т. д. Синтаксис команд Bash включает идеи, взятые из оболочки Korn (ksh) и оболочки C (csh), такие как редактирование командной строки, история команд ( history
command), [46] стек каталогов, переменные $RANDOM
и и синтаксис подстановки команд$PPID
POSIX .$(...)
Когда пользователь нажимает клавишу Tab в интерактивной командной оболочке, Bash автоматически использует автодополнение командной строки , начиная с бета-версии 2.04, [47] для сопоставления частично набранных имен программ, имен файлов и имен переменных. Система автодополнения командной строки Bash очень гибкая и настраиваемая, и часто поставляется с функциями, которые дополняют аргументы и имена файлов для определенных программ и задач.
Синтаксис Bash имеет много расширений, которых нет в оболочке Bourne. Bash может выполнять целочисленные вычисления («арифметическая оценка»), не порождая внешние процессы. Для этой цели он использует синтаксис ((...))
command и variable. Его синтаксис упрощает перенаправление ввода-вывода . Например, он может перенаправлять стандартный вывод (stdout) и стандартную ошибку (stderr) одновременно с помощью оператора . Это проще вводить, чем эквивалент оболочки Bourne ' '. Bash поддерживает подстановку процессов с помощью синтаксиса and , который заменяет вывод (или ввод) команды, где обычно используется имя файла. (Это реализовано через неименованные каналы /proc/fd/ в системах, которые это поддерживают, или через временные именованные каналы , где это необходимо).$((...))
&>
command > file 2>&1
<(command)
>(command)
При использовании ключевого слова «function» объявления функций Bash несовместимы со скриптами Bourne/Korn/POSIX (KornShell имеет ту же проблему при использовании «function»), но Bash принимает тот же синтаксис объявления функций, что и оболочки Bourne и Korn, и соответствует POSIX. Из-за этих и других различий скрипты оболочки Bash редко запускаются под интерпретаторами оболочек Bourne или Korn, если только они специально не написаны с учетом этой совместимости, что становится все менее распространенным по мере того, как Linux становится все более распространенным. Но в режиме POSIX Bash более точно соответствует POSIX. [48]
Bash поддерживает here documents . Начиная с версии 2.05b Bash может перенаправлять стандартный ввод (stdin) из "here string" с помощью <<<
оператора .
Bash 3.0 поддерживает внутрипроцессное сопоставление регулярных выражений , используя синтаксис, напоминающий Perl . [49]
В феврале 2009 года [50] Bash 4.0 представил поддержку ассоциативных массивов . [51] Индексы ассоциативных массивов представляют собой строки, подобно AWK или Tcl . [52] Их можно использовать для эмуляции многомерных массивов. Bash 4 также меняет свою лицензию на GPL-3.0-или-более позднюю ; некоторые пользователи подозревают, что это изменение лицензирования является причиной того, что macOS продолжает использовать старые версии. [53] Zsh стал оболочкой по умолчанию в macOS с выпуском macOS Catalina в 2019 году . [54]
Расширение скобок, также называемое чередованием, — это функция, скопированная из оболочки 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 в текущем каталоге можно получить с помощью:
ls *. { 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 файл { 1 ..4 } .txt файл1.txt файл2.txt файл3.txt файл4.txt $ echo { a..e } abcde $ echo { 1 ..10..3 } 1 4 7 10 $ echo { a..j..3 } adgj
Когда раскрытие фигурных скобок сочетается с раскрытием переменной (также известное как раскрытие параметра и подстановка параметра ), раскрытие переменной выполняется после раскрытия фигурных скобок, что в некоторых случаях может потребовать использования eval
встроенной функции, например:
$ start = 1 ; end = 10 $ echo { $start .. $end } # не удается расширить из-за порядка оценки {1..10} $ eval echo { $start .. $end } # происходит расширение переменной, затем оценивается результирующая строка 1 2 3 4 5 6 7 8 9 10
При запуске Bash выполняет команды из множества dot-файлов . В отличие от скриптов оболочки Bash, dot-файлы обычно не имеют ни разрешений на выполнение, ни директивы интерпретатора, например #!/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 . [55] Скрипты оболочки Bash, предназначенные для переносимости, должны учитывать по крайней мере стандарт оболочки POSIX. Некоторые функции bash, не найденные в POSIX: [55] [56]
[[...]]
и ее соответствие регулярному выражению(( ... ))
; $(( ... ))
— это POSIX)local
для переменных с ограниченной областью действияЕсли фрагмент кода использует такую функцию, это называется «башизмом» — проблемой для переносимого использования. Debian checkbashisms
и Vidar Holen shellcheck
могут быть использованы для того, чтобы убедиться, что скрипт не содержит этих частей. [58] [59] Список варьируется в зависимости от фактической целевой оболочки: политика Debian допускает некоторые расширения в своих скриптах (как в оболочке dash ), [56] в то время как скрипт, предназначенный для поддержки оболочек Bourne до POSIX, таких как autoconf , еще configure
более ограничен в функциях, которые он может использовать. [60]
Bash использует GNU Readline для предоставления сочетаний клавиш для редактирования командной строки с использованием сочетаний клавиш по умолчанию ( Emacs ). Vi-связывания можно включить, запустив set -o vi
. [61]
Оболочка Bash имеет два режима выполнения команд: пакетный (асинхронный) и параллельный (синхронный).
Для выполнения команд в пакетном режиме (т.е. последовательно) они должны быть разделены символом «;» или на отдельных строках:
команда1 ; команда2команда3
В этом примере после завершения команды 1 выполняется команда 2, а после завершения команды 2 выполняется команда 3.
Фоновое выполнение команды command1 может быть выполнено с использованием (символа &) в конце команды выполнения, и процесс будет выполнен в фоновом режиме, при этом управление немедленно вернется в оболочку и будет разрешено продолжить выполнение команд.
команда1 &
Или для одновременного выполнения command1 и command2, их необходимо выполнить в оболочке Bash следующим образом:
команда1 и команда2
В этом случае команда 1 выполняется в фоновом режиме и символе, немедленно возвращая управление оболочке, которая выполняет команду 2 в активном режиме.
Процесс можно остановить и вернуть управление bash, набрав Ctrl+ z, пока процесс выполняется на переднем плане. [62]
Список всех процессов, как работающих в фоновом режиме, так и остановленных, можно получить, выполнив команду jobs
:
$ jobs [1]- Выполнение команды1 и [2]+ Остановленная команда2
В выводе число в скобках относится к идентификатору задания. Знак «плюс» обозначает процесс по умолчанию для bg
и fg
. Тексты «Running» и «Stopped» относятся к состоянию процесса . Последняя строка — это команда, которая запустила процесс.
Состояние процесса можно изменить с помощью различных команд. fg
Команда выводит процесс на передний план, а bg
остановленный процесс запускает в фоновом режиме. bg
и fg
может принимать идентификатор задания в качестве первого аргумента, чтобы указать процесс, над которым нужно работать. Без него они используют процесс по умолчанию, обозначенный знаком плюс в выводе jobs
. kill
Команду можно использовать для преждевременного завершения процесса, отправив ему сигнал . Идентификатор задания должен быть указан после знака процента:
убить %1
Bash предоставляет разделители команд "условного выполнения", которые делают выполнение команды зависимым от кода выхода, установленного предшествующей командой. Например:
cd " $SOMEWHERE " && ./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 (или, по желанию, на другие адреса электронной почты). [63] [64]
Bash поддерживает программируемое завершение с помощью встроенных команд complete
, compopt
и compgen
. [65] Эта функция доступна с момента выхода бета-версии 2.04 в 2000 году. [66] [67] Эти команды позволяют реализовать сложную и интеллектуальную спецификацию завершения для команд (т. е. установленных программ), функций, переменных и имен файлов. [68]
Команды complete
и compopt
две определяют, как аргументы некоторых доступных команд или опций будут перечислены во входных данных readline . Начиная с версии 5.1 завершение команды или опции обычно активируется нажатием клавиши после ввода ее имени. [68]Tab ↹
Название программы — это фигура речи или острота , которая начинается с дани уважения Стивену Борну , создателю одной из программ-оболочек, которые иногда считались вытесненными оболочкой bash. Его имя используется как каламбур на образе родов . С этим каламбуром, как кажется, добавляется намек : возможно, на индуистскую или буддийскую идею реинкарнации ; возможно, на христианскую идиому, известную как «быть рожденным заново »; или, вполне возможно, просто на более абстрактную идею обновления. В то время как многочисленные английские переводы христианского Нового Завета , Книги Иоанна , главы 3, содержат слова «рожденный заново», словарь Merriam-Webster определяет «рожденный заново» как «...человека, который принял обновленное или подтвержденное обязательство ... [69] ». Каким бы ни был исходный пробный камень, в конце концов программа получила название « Облицовка Bourne Again ». [70] [71]
Аббревиатура этого названия — «bash», слово, означающее «ударить с силой». [ 72] В контексте компьютерного программирования «ударить с силой по чему-либо», например по клавиатуре компьютера, можно считать гиперболическим образом некоторого разочарования . Такой образ негативной эмоциональности можно рассматривать как стоящий в прямом сопоставлении с идеей «заново родиться».
Наименование можно считать примером словесной иронии [73] или случайного намёка . [74] Грамматика Bash изначально была основана на грамматиках самых популярных программ оболочки Unix, которые использовались в то время, некоторые из которых считались особенно сложными в использовании или раздражающими в то время. С течением лет разработка bash сделала его грамматику более удобной для пользователя, [75] [76] [77] [78] [79] [80] настолько, что кажется вероятным, что проект bash был нацелен на улучшение его удобства использования. С тех пор bash стал де-факто программой оболочки по умолчанию в большинстве операционных систем Linux и Unix.
В качестве стандарта, на котором основана bash, можно привести POSIX или IEEE Std 1003.1, [81] и последующие.
Страница руководства Linux [82] [83] призвана стать авторитетным объяснительным документом для понимания того, как bash
работает, в то время как руководство GNU иногда считается более удобным для чтения. "Вы также можете найти информацию о Bash, запустив info bash... или просмотрев /usr/share/doc/bash/
, /usr/local/share/doc/bash/
, или аналогичные каталоги в вашей системе. Краткую сводку можно получить, запустив bash --help. [70] "
В современных Linux-системах информацию о встроенных командах оболочки можно найти, выполнив help,
help [built-in name]
или man builtins
в командной строке терминала, где установлен bash. Некоторые команды, такие как echo
, false
, kill
, или , в зависимости от вашей системы и локально установленной версии bash, могут ссылаться либо на встроенный файл оболочки, либо на системный двоичный исполняемый файл. Когда происходит одно из этих конфликтов имен команд, bash по умолчанию выполнит заданную командную строку, используя встроенный файл оболочки. Указание абсолютного пути к двоичному исполняемому файлу (т. е. ) является одним из способов обеспечения того, чтобы оболочка использовала системный двоичный файл. Эта проблема конфликта имен также влияет на любые «справочные сводки», просматриваемые с помощью и . Встроенные файлы оболочки и системные двоичные исполняемые файлы с одинаковым именем часто имеют разные параметры.printf
test
true
/bin/printf
kill --help
/bin/kill --help
«У ответственного за проект также есть страница Bash, которая включает в себя часто задаваемые вопросы», [84] [85] [70] этот FAQ актуален для версии bash 5.1 и больше не обновляется.
Уязвимость безопасности Bash, появившаяся в версии 1.03 (август 1989 г.), [86] получившая название Shellshock , была обнаружена в начале сентября 2014 г. и быстро привела к ряду атак по всему Интернету . [87] [88] [89] Патчи для исправления ошибок были выпущены вскоре после их обнаружения.
Начиная с версии 4.0: GPL-3.0 или более поздняя [90]
1.11? по 3.2: GPL-2.0 или более поздняя версия [91]
0.99? до 1.05?: GPL-1.0 или более поздняя версия [92] [51] [93]
Версия также доступна для Windows 10 и Windows 11 через подсистему Windows для Linux . [94] [95] Это также пользовательская оболочка по умолчанию в Solaris 11. [96] Bash также была оболочкой по умолчанию в BeOS , [15] и в версиях Apple macOS от 10.3 (первоначально оболочкой по умолчанию была tcsh ) до 10.15 ( macOS Catalina ), которая изменила оболочку по умолчанию на zsh , [32] хотя Bash остается доступным в качестве альтернативной оболочки. [54]
{{cite web}}
: Отсутствует или пусто |title=
( помощь )Free Software Foundation (FSF) — некоммерческая организация с всемирной миссией по содействию свободе пользователей компьютеров.
Конечная цель — предоставить свободное программное обеспечение для выполнения всех задач, которые хотят выполнять пользователи компьютеров, и таким образом оставить проприетарное программное обеспечение в прошлом.
Брайан Фокс завершил версию sh от GNU, названную BASH, `Bourne Again SHell'.
— это операционная система, которая является на 100% свободным программным обеспечением.
shell — это интерактивный командный интерпретатор и командный язык программирования.
течение полутора лет оболочка GNU была "почти готова". Автор неоднократно давал обещания предоставить то, что он сделал, и никогда их не выполнял. Наконец, я больше не мог верить, что он когда-либо что-либо предоставит. Поэтому сотрудник Фонда Брайан Фокс теперь реализует имитацию оболочки Bourne.
Ричард Столлман решил создать полную замену для тогда еще обремененных систем Unix, он знал, что в конечном итоге ему придется иметь замены для всех распространенных утилит, особенно стандартной оболочки, и эти замены должны будут иметь приемлемое лицензирование.ПРИМЕЧАНИЕ: Исходная ссылка computerworld.com.au не работает: см. также копии исходного материала на
«Bourne Again Shell» — это игра слов с названием Bourne Shell , которое было обычной оболочкой в Unix.
представляет собой игру слов на названии оболочки Bourne (sh), ранней и важной оболочки Unix, написанной Стивеном Борном и распространявшейся с версией 7 Unix около 1978 года, и концепции «рождения заново».
В настоящее время я портировал bash(1.08) и gcc(1.40), и, похоже, все работает.
дата рождения: воскресенье, 10 января 1988 г. Первоначальный автор: Брайан Фокс
Free Software Foundation написали и поддерживают ряд пакетов программного обеспечения GNU. Два наиболее примечательных из них — библиотека C и оболочка. ... Мы финансировали разработку этих программ, потому что проект GNU был не просто инструментами или средой разработки. Нашей целью была полноценная операционная система, и эти программы были необходимы для этой цели.
В Linux большинство пользователей запускают bash, поскольку это самая популярная оболочка.
Bourne Again Shell (bash) — наиболее распространённая оболочка, устанавливаемая с дистрибутивами Linux.
Bash — безусловно, самая популярная оболочка, которая является оболочкой по умолчанию в системах Linux и Mac OSX.
Bash — это свободное программное обеспечение, распространяемое в соответствии с условиями Стандартной общественной лицензии [GNU], опубликованной Free Software Foundation, версии 3 Лицензии (или любой более поздней версии).
См. test.c для GPL-2.0-или-более поздней версии