Оригинальный автор(ы) | Брайан Фокс |
---|---|
Разработчик(и) | Чет Рэми |
Первоначальный выпуск | 8 июня 1989 г ( 8 июня 1989 ) |
Стабильный релиз | 5.2.37 [1] / 23 сентября 2024 г. |
Репозиторий |
|
Написано в | С |
Операционная система | |
Платформа | ГНУ |
Доступно в | Многоязычный ( gettext ) |
Тип | Оболочка (вычисления) , оболочка Unix , командный язык |
Лицензия |
|
Веб-сайт | www.gnu.org/software/bash/ |
В вычислительной технике Bash ( сокращение от « Bourne Again SHell ,») [6] — интерактивный командный интерпретатор и командный язык программирования [7], разработанный для UNIX -подобных операционных систем. Созданный в 1989 году [8] Брайаном Фоксом для проекта GNU [9] , он поддерживается Free Software Foundation [10] и разработан как 100% [11] свободная альтернатива оболочке Bourne ( sh
) [12] и другим проприетарным оболочкам Unix .
С момента своего создания Bash получил широкое распространение и обычно используется в качестве оболочки входа по умолчанию для многочисленных дистрибутивов Linux . [13] Он имеет историческое значение как одна из самых ранних программ, портированных на Linux Линусом Торвальдсом , наряду с компилятором GNU ( GCC ). [14] Он доступен практически во всех современных операционных системах, что делает его универсальным инструментом в различных вычислительных средах.
Как интерфейс командной строки (CLI), Bash работает в текстовом окне , где пользователи вводят команды для выполнения различных задач. Он также поддерживает выполнение команд из файлов, известных как скрипты оболочки , что облегчает автоматизацию . В соответствии с соглашениями оболочки Unix , Bash включает в себя богатый набор функций. Ключевые слова , синтаксис , динамически определяемые переменные и другие основные функции языка скопированы из оболочки Bourne , sh
. Другие функции, например, история , скопированы из оболочки C , csh
, и оболочки Korn , ksh
. Это совместимая с POSIX оболочка с расширениями.
Хотя Bash был разработан для UNIX и UNIX-подобных операционных систем, таких как GNU/Linux, [15] он также доступен на Android, macOS, Windows и многочисленных других современных и исторических операционных системах. «Хотя были попытки создать специализированные оболочки, производные оболочки Bourne продолжают оставаться основными используемыми оболочками». [16]
В этой статье есть несколько проблем. Помогите улучшить ее или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти сообщения )
|
« Кристофер Стрейчи , британский ученый, посетил Массачусетский технологический институт примерно в то же время, и его проект макрогенератора показался мне очень прочной основой для командного языка, в частности, методов цитирования и передачи аргументов. Не будучи приглашенным по этой теме, я написал статью, объясняющую, как можно разработать командный язык Multics с этой целью. И я придумал слово «shell» для его названия». [17]
glob
, для сопоставления с образцом, и if
, для условных выражений. «Оболочка представила компактный синтаксис для перенаправления ( <
>
и >>
) и конвейеризации ( |
или ^
), который сохранился в современных оболочках. Вы также можете найти поддержку для вызова последовательных команд (с ;
) и асинхронных команд (с &
).» [16] Она также включала команду goto.Как командный процессор , Bash работает в текстовом окне , где пользователи вводят команды для выполнения различных задач. Он также поддерживает выполнение команд из файлов, известных как скрипты оболочки , облегчая автоматизацию . В соответствии с соглашениями оболочки Unix , Bash включает в себя богатый набор функций, включая:
info bash
, а техническое руководство доступно по адресу man bash
.if
, case
, select
,&&
) и ИЛИ ( ||
), иfor
, while
, until
петли иfor ((
;test
командование,[
, [[ ... ]]
, включающий расширенные функции:<
и >
;|
;( ... )
;trap
встроенных средств;job_spec &
где job_spec
может быть одно из:<command_name> <options> <operands> <arguments> &
, или%1 &
;#
и:
Комментарии в стиле Томпсона с двоеточием;\
также допускается в конце строк;$'...'
;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}
,$( ... )
,<()
или >()
, когда система это поддерживает:(( ... ))
или $(( ... ))
, включаяbc
и awk
, среди прочих),*
, ?
, [...]
, и[...]
, и использование скобок в командах тестирования, [
и [[ ... ]]
, — это разные вещи.)>
, и добавление, >>
,<<
,<<<
, которые позволяют использовать параметры в качестве входных данных, и>|
который может принудительно перезаписать файл, если в оболочке включена настройка «noclobber»;ls
или ln
, иBash также предлагает...
~/.bashrc
такие как и ~/.profile
(т. е. dotfiles );set
встроенные ) и параметры оболочки ( shopt
встроенные ), которые изменяют поведение оболочки;pushd
и popd
встроенные),cd
pwd
help
команда.Синтаксис команд Bash является надмножеством синтаксиса команд оболочки Bourne. Bash поддерживает раскрытие фигурных скобок , [78] завершение командной строки (программируемое завершение), [79] базовую отладку [80] [81] и обработку сигналов (используя trap
) начиная с bash 2.05a [82] [83] среди других функций. Bash может выполнять подавляющее большинство сценариев оболочки Bourne без изменений, за исключением сценариев оболочки Bourne, которые сталкиваются с поведением синтаксиса fringe, интерпретируемым по-разному в Bash, или пытаются запустить системную команду, соответствующую более новой встроенной команде Bash и т. д. Синтаксис команд Bash включает идеи, взятые из оболочки Korn (ksh) и оболочки C (csh), такие как редактирование командной строки, история команд ( history
command), [84] стек каталогов, переменные $RANDOM
и и синтаксис подстановки команд$PPID
POSIX .$(...)
Когда пользователь нажимает клавишу Tab в интерактивной командной оболочке, Bash автоматически использует автодополнение командной строки , начиная с бета-версии 2.04, [85] для сопоставления частично набранных имен программ, имен файлов и имен переменных. Система автодополнения командной строки 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. [86]
Bash поддерживает here documents . Начиная с версии 2.05b Bash может перенаправлять стандартный ввод (stdin) из "here string" с помощью <<<
оператора .
Bash 3.0 поддерживает внутрипроцессное сопоставление регулярных выражений , используя синтаксис, напоминающий Perl . [87]
В феврале 2009 года [88] Bash 4.0 представил поддержку ассоциативных массивов . [4] Индексы ассоциативных массивов представляют собой строки, подобно AWK или Tcl . [89] Их можно использовать для эмуляции многомерных массивов. Bash 4 также меняет свою лицензию на GPL-3.0-или-более позднюю . [90]
Bash предоставляет разделители команд "условного выполнения", которые делают выполнение команды зависимым от кода выхода, установленного предшествующей командой. Например:
cd " $SOMEWHERE " && ./do_something || echo "Произошла ошибка" > & 2
Where ./do_something
выполняется только в том случае, если cd
команда (изменить каталог) была «успешной» (вернула нулевой код завершения), и echo
команда будет выполнена только в том случае, если либо команда cd
, либо ./do_something
команда вернет «ошибку» (ненулевой код завершения).
Для всех команд статус выхода сохраняется в специальной переменной $?
. Bash также поддерживает и формы условной оценки команд.if ...;then ...;else ...;fi
case $VARIABLE in $pattern)...;;$other_pattern)...;; esac
Оболочка Bash имеет два режима выполнения команд: пакетный (асинхронный) и параллельный (синхронный).
Для выполнения команд в пакетном режиме (т.е. последовательно) они должны быть разделены символом «;» или на отдельных строках:
команда1 ; команда2команда3
В этом примере после завершения команды 1 выполняется команда 2, а после завершения команды 2 выполняется команда 3.
Фоновое выполнение команды command1 может быть выполнено с использованием (символа &) в конце команды выполнения, и процесс будет выполнен в фоновом режиме, при этом управление немедленно вернется в оболочку и будет разрешено продолжить выполнение команд.
команда1 &
Или для одновременного выполнения command1 и command2, их необходимо выполнить в оболочке Bash следующим образом:
команда1 и команда2
В этом случае команда 1 выполняется в фоновом режиме и символе, немедленно возвращая управление оболочке, которая выполняет команду 2 в активном режиме.
Процесс можно остановить и вернуть управление bash, набрав Ctrl+ z, пока процесс выполняется на переднем плане. [91]
Список всех процессов, как работающих в фоновом режиме, так и остановленных, можно получить, выполнив команду jobs
:
$ jobs [1]- Выполнение команды1 и [2]+ Остановленная команда2
В выводе число в скобках относится к идентификатору задания. Знак «плюс» обозначает процесс по умолчанию для bg
и fg
. Тексты «Running» и «Stopped» относятся к состоянию процесса . Последняя строка — это команда, которая запустила процесс.
Состояние процесса можно изменить с помощью различных команд. fg
Команда выводит процесс на передний план, а bg
остановленный процесс запускает в фоновом режиме. bg
и fg
может принимать идентификатор задания в качестве первого аргумента, чтобы указать процесс, над которым нужно работать. Без него они используют процесс по умолчанию, обозначенный знаком плюс в выводе jobs
. kill
Команду можно использовать для преждевременного завершения процесса, отправив ему сигнал . Идентификатор задания должен быть указан после знака процента:
убить %1
Вызов Bash с --posix
опцией или указанием set -o posix
в скрипте приводит Bash к очень близкому соответствию стандарту POSIX 1003.2 . [92] Скрипты оболочки Bash, предназначенные для переносимости, должны учитывать по крайней мере стандарт оболочки POSIX. Некоторые функции bash, не найденные в POSIX: [92] [93]
[[...]]
и ее соответствие регулярному выражению(( ... ))
; $(( ... ))
— это POSIX)local
для переменных с ограниченной областью действияЕсли фрагмент кода использует такую функцию, это называется «башизмом» — проблемой для переносимого использования. Debian checkbashisms
и Vidar Holen shellcheck
могут быть использованы для того, чтобы убедиться, что сценарий не содержит этих частей. [95] [96] Список варьируется в зависимости от фактической целевой оболочки: политика Debian допускает некоторые расширения в своих сценариях (как в оболочке dash ), [93] в то время как сценарий, предназначенный для поддержки оболочек Bourne до POSIX, таких как autoconf , еще configure
более ограничен в возможностях, которые он может использовать. [97]
"Комментарии начинаются с $ или * в качестве первого символа строки. Комментарии, использующие $, печатаются (включая $) при запуске RUNCOM, а комментарии, использующие *, вообще не печатаются. Подстановка параметров в комментариях не происходит. ( RUNCOM )"
Расширение скобок, также называемое чередованием, — это функция, скопированная из оболочки 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
This section contains instructions, advice, or how-to content. (January 2019) |
При запуске Bash он выполняет команды из множества dot-файлов . [98] В отличие от сценариев оболочки 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 .
set
set -x
| set -o xtrace
]Основное средство отладки оболочки. И xtrace, и verbose можно отключить одновременно с помощью команды set -
.
set -v
| set -o verbose
]Выводит команду на терминал по мере того, как Bash ее читает. Bash читает конструкции все сразу, например, составные команды, включающие блоки if-fi и case-esac. Если a set -v
включено в составную команду, то "verbose" будет включен в следующий раз, когда Bash прочитает код как входные данные, т. е. после завершения текущей выполняемой конструкции. [99] И xtrace, и verbose можно отключить одновременно с помощью команды set -
.
shopt
По умолчанию в интерактивных оболочках. Некоторые разработчики не рекомендуют использовать его в скриптах.
Bash поддерживает программируемое завершение с помощью встроенных команд complete
, compopt
и compgen
. [100] Эта функция доступна с момента выхода бета-версии 2.04 в 2000 году. [101] [102] Эти команды позволяют реализовать сложную и интеллектуальную спецификацию завершения для команд (т. е. установленных программ), функций, переменных и имен файлов. [103]
Команды complete
и compopt
две определяют, как аргументы некоторых доступных команд или опций будут перечислены во входных данных readline . Начиная с версии 5.1 завершение команды или опции обычно активируется нажатием клавиши после ввода ее имени. [103]Tab ↹
Bash использует GNU Readline для предоставления сочетаний клавиш для редактирования командной строки с использованием сочетаний клавиш по умолчанию ( Emacs ). Vi-связывания можно включить, запустив set -o vi
. [104]
В качестве стандарта, на котором основана bash, особенно информативен стандарт POSIX или IEEE Std 1003.1, [105] и последующие.
Linux "man page" [106] [107] призван быть авторитетным пояснительным техническим документом для понимания того, как bash
работает. Обычно он доступен при запуске man bash
.
Руководство GNU иногда считается более удобным для чтения. "Вы также можете найти информацию о Bash, запустив info bash
... или просмотрев /usr/share/doc/bash/
, /usr/local/share/doc/bash/
, или аналогичные каталоги в вашей системе. Краткую сводку можно получить, запустив bash --help
. [108]
«Если пользователь вызывает RUNCOM без каких-либо аргументов, он выводит некоторые инструкции по его использованию и останавливается, возвращая пользователя в командную строку супервизора (системы). ( RUNCOM )»
В современных 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, которая включает в себя часто задаваемые вопросы» [109] [108] этот FAQ актуален для версии bash 5.1 и больше не обновляется.
Запуск любых скриптов оболочки от имени пользователя root в течение многих лет широко критиковался как плохая практика безопасности. Одной из часто упоминаемых причин является то, что при запуске скрипта от имени пользователя root негативные последствия любых ошибок в скрипте будут усилены повышенными привилегиями пользователя root.
Один распространенный пример: скрипт содержит команду rm -rf ${dir}/
, но переменная $dir
остается неопределенной. В Linux, если скрипт был выполнен обычным пользователем, оболочка попытается выполнить команду rm -rf /
как обычный пользователь, и команда не будет выполнена. Однако, если скрипт был выполнен пользователем root, то команда, скорее всего, будет выполнена успешно, и файловая система будет стерта.
Вместо этого рекомендуется использовать его sudo
для каждой команды.
Особенность | POSIX 2024 | Описание | Bash-версия. | ||
---|---|---|---|---|---|
Тип грамматики | Официальное название | Синтаксис | |||
Расширение параметров | Указать ноль или неустановлено | "${parameter:?[word]}" | Да | «Где расширение [слова], возможно, сообщение об ошибке или номер строки, записывается в STDERR, и оболочка завершается с ненулевым кодом выхода». | ? |
Специальные параметры | Статус выхода | "$?" | Да | «Расширяется до кратчайшего представления десятичного статуса выхода». | ? |
Специальные параметры | PID вызванной оболочки | "$$" | Да | «Расширяется до кратчайшего представления десятичного идентификатора процесса вызванной оболочки». | ? |
Специальная встроенная утилита | набор :: xtrace | set -x | Да | Основное средство отладки оболочки . Она «записывает в стандартный поток ошибок трассировку для каждой команды после ее раскрытия и перед ее выполнением». | ? |
Специальная встроенная утилита | набор :: подробный | set -v | Да | «Записывает входные данные в стандартный поток ошибок по мере их чтения». | ? |
Специальная встроенная утилита | набор :: pipefail | set -o pipefail | Да | «Выведите статус завершения конвейера из статусов завершения всех команд в конвейере, а не только последней (самой правой) команды». | ? |
Специальная встроенная утилита | набор :: набор существительных | set -u | Да | При включении приведет к выходу оболочки с сообщением об ошибке при обнаружении неустановленного расширения переменной. Его использование имеет ряд контринтуитивных ловушек. | ? |
Специальная встроенная утилита | установить :: errexit | set -e | Да | ErrExit — это параметр, который при включении при определенных, очень специфических условиях заставит оболочку завершить работу без сообщения об ошибке, когда оболочка получает ненулевой код выхода. Его использование несколько спорно, в той степени, в которой любая малоизвестная компьютерная программа может считаться спорной. Сторонники утверждают, что ErrExit обеспечивает гарантию проверяемости в ситуациях, когда скрипты оболочки «не должны давать сбой». Однако противники утверждают, что его использование ненадежно, обманчиво просто, крайне нелогично, изобилует подводными камнями и подводными камнями и, по сути, является «театром безопасности». Многочисленные разработчики Bash настоятельно не одобряют использование этого конкретного параметра. | ? |
Специальная встроенная утилита | ловушка :: ВЫХОД | trap '[arg]' EXIT | Да | «Если [sigspec] (спецификатор сигнала) равен 0 или EXIT, [arg] выполняется при выходе из оболочки». Если [arg] содержит расширения, то [arg] следует заключить в одинарные кавычки. | ? |
Утилита | printf | printf '<%s>\n' "${var}" | Да | Средство надежной печати содержимого переменной. | ? |
Переменные Bash | БАШПИД | "${BASHPID}" | Нет | «Расширяется до идентификатора текущего процесса bash». [110] | ? |
Переменные Bash | BASH_ARGC | "${BASH_ARGC[@]}" | Нет | «Переменная массива, значения которой представляют собой количество параметров в каждом кадре текущего стека вызовов выполнения bash». [111] | ? |
Переменные Bash | BASH_ARGV | "${BASH_ARGV[@]}" | Нет | «Переменная массива, содержащая все параметры в текущем стеке вызовов выполнения bash». [112] | ? |
Переменные Bash | BASH_LINENO | "${BASH_LINENO[@]}" | Нет | «Переменная массива, элементы которой являются номерами строк в исходных файлах, где был вызван каждый соответствующий элемент FUNCNAME». [113] | ? |
Переменные Bash | BASH_REMATCH | "${BASH_REMATCH[@]}" | Нет | «Переменная массива, элементы которой назначаются бинарным оператором =~ условной команде [[». [114] | ? |
Переменные Bash | BASH_ИСТОЧНИК | "${BASH_SOURCE}" | Нет | «Переменная массива, элементы которой являются именами исходных файлов, в которых определены соответствующие имена функций оболочки в переменной массива FUNCNAME». [115] | ? |
Переменные Bash | BASH_XTRACEFD | "${BASH_XTRACEFD}" | Нет | «Если задано целое число, соответствующее допустимому файловому дескриптору, Bash запишет вывод трассировки, сгенерированный при включении 'set -x', в этот файловый дескриптор». [116] | ? |
Переменные Bash | EPOCHREALTIME | "${EPOCHREALTIME}" | Нет | «Каждый раз, когда к этому параметру обращаются, он расширяется до количества секунд с начала эпохи Unix (см. time(3)) как значение с плавающей точкой с точностью до микросекунды». [117] | ? |
Переменные Bash | ИМЯ ФУНКЦИИ | "${FUNCNAME[@]}" | Нет | «Переменная массива, содержащая имена всех функций оболочки, находящихся в данный момент в стеке вызовов выполнения». [118] | ? |
Переменные Bash | ЛИНЕНО | "${LINENO}" | Нет | «Каждый раз, когда ссылаются на этот параметр, оболочка подставляет десятичное число, представляющее текущий последовательный номер строки (начиная с 1) в скрипте или функции». [119] | ? |
Переменные Bash | ТРУБОПРОВОД | "${PIPESTATUS[@]}" | Нет | «Переменная массива, содержащая список значений статуса выхода из процессов в последнем выполненном приоритетном конвейере (который может содержать только одну команду)». [120] | ? |
Переменные Bash | ППИД | "${PPID}" | Нет | «Идентификатор процесса родителя оболочки». [121] | ? |
Переменные Bash | ПС4 | "${PS4}" | Нет | «Значение этого параметра расширяется, как и в случае с PS1, и значение выводится перед каждой командой, которую bash отображает во время трассировки выполнения». [122] | ? |
Встроенная оболочка | установить :: ограничено | set -r | Нет | Ограниченный режим предназначен для повышения безопасности отдельного экземпляра оболочки от злонамеренного человека с физическим доступом к машине. Поскольку модели угроз изменились, он стал использоваться реже, чем раньше. | ? |
Встроенная оболочка | shopt :: extdebug | shopt -s extdebug | Нет | «Поведение, предназначенное для использования отладчиками». | ? |
Встроенная оболочка | ловушка :: ОТЛАДКА | trap '[arg]' DEBUG | Нет | «Если sigspec имеет значение DEBUG, команда arg выполняется перед» определенными видами команд. | ? |
Встроенная оболочка | ловушка :: ERR | trap '[arg]' ERR | Нет | «Если sigspec равен ERR, команда arg выполняется всякий раз, когда...» определенные виды команд «возвращают ненулевой статус выхода», при этом действуют такие же ограничения, как и для ErrExit. | ? |
Встроенная оболочка | ловушка :: ВОЗВРАТ | trap '[arg]' RETURN | Нет | «Если sigspec равен RETURN, команда arg выполняется каждый раз, когда завершается выполнение функции оболочки или скрипта, запущенного с помощью встроенных функций . или source». | ? |
set
: [126] [127]trap [-lp] [arg] [sigspec …]
printf
: средство надежной печати содержимого переменной:set
: [126] [127]shopt
: [131] [127]trap [-lp] [arg] [sigspec …]
trap
При :?
расширении параметров неустановленная или нулевая переменная может остановить выполнение скрипта.
#!/bin/bash bar = " foo не определен" echo " ${ foo : ? $bar } " echo это сообщение не печатается
$ ./ex.sh ./ex.sh: строка 3: foo: foo не определен
Надежная печать содержимого массива, содержащего пробелы и символы новой строки, сначала в переносимом синтаксисе, а затем то же самое в Bash. Обратите внимание, что в Bash количество пробелов перед символом новой строки указано явно.
$ # В оболочке POSIX: $ array =( "a " " b" " > c " ) $ printf ',%s,\n' " ${ array [@] } " ,a , , b, , c ,
# В Bash: объявить -p массив объявить -a массив =([ 0 ]= "a " [ 1 ]= " b" [ 2 ]= $' \nc ' )
Печать сообщения об ошибке при возникновении проблемы.
если ! lsblk | grep sdb then echo Ошибка, строка $LINENO fi
$ ./error.sh Ошибка, строка 130
Используя xtrace . Если бы errexit был включен, то он бы не был выполнен.echo quux
#!/bin/bash set -x foo = bar ; echo $foo false echo quux
$ ./test.sh + foo=bar + echo bar bar + false + echo quux quux
`...`
устарела в пользу $(...)
;test
/ [
/ ,[[
[ -r ./file -a ! -l ./file ]
устарело в пользу [ -r ./file ] && ! [ -l ./file ]
;$[...]
устарело в пользу $((...))
или ((...))
, в зависимости от ситуации;expr
или let
.В сентябре 2014 года в программе была обнаружена уязвимость безопасности [137] . Она получила название « Shellshock ». Публичное раскрытие информации быстро привело к ряду атак по всему Интернету . [138] [139] [140]
Эксплуатация уязвимости может привести к выполнению произвольного кода в скриптах CGI , исполняемых определенными версиями Bash. Ошибка заключалась в том, как Bash передавал определения функций подоболочкам через переменные окружения . [141] Ошибка присутствовала в исходном коде с августа 1989 года (версия 1.03) [142] и была исправлена в сентябре 2014 года (версия 4.3).
Патчи для исправления ошибок были доступны вскоре после их обнаружения. Настоятельно рекомендуется обновиться до текущей версии.
Ему были присвоены идентификаторы Common Vulnerability CVE- 2014-6271, CVE-2014-6277 и CVE-2014-7169, среди прочих. Согласно метрикам CVSS 2.x и 3.x, ошибка считается «высокой» и «критической» соответственно.
Внешняя команда bashbug сообщает об ошибках оболочки Bash. При вызове команды открывается редактор пользователя по умолчанию с формой для заполнения. Форма отправляется по почте разработчикам Bash (или, по желанию, на другие адреса электронной почты). [143] [144]
В этой книге описывается последняя версия bash 2.0 (версия 2.01, датированная июнем 1997 г.).
Bash — это свободное программное обеспечение, распространяемое в соответствии с условиями Стандартной общественной лицензии [GNU], опубликованной Free Software Foundation, версии 3 Лицензии (или любой более поздней версии).
См. test.c для GPL-2.0-или-более поздней версии
«Bourne Again Shell» — это игра слов с названием Bourne Shell , которое было обычной оболочкой в Unix.
представляет собой игру слов на названии оболочки Bourne (sh), ранней и важной оболочки Unix, написанной Стивеном Борном и распространявшейся с версией 7 Unix около 1978 года, и концепции «рождения заново».
shell — это интерактивный командный интерпретатор и командный язык программирования.
Конечная цель — предоставить свободное программное обеспечение для выполнения всех задач, которые хотят выполнять пользователи компьютеров, и таким образом оставить проприетарное программное обеспечение в прошлом.
Free Software Foundation (FSF) — некоммерческая организация с всемирной миссией по содействию свободе пользователей компьютеров.
— это операционная система, которая на 100% является свободным программным обеспечением.
Брайан Фокс завершил версию sh от GNU, названную BASH, `Bourne Again SHell'.
Ричард Столлман решил создать полную замену для тогда еще обремененных систем Unix, он знал, что в конечном итоге ему придется иметь замены для всех распространенных утилит, особенно стандартной оболочки, и эти замены должны будут иметь приемлемое лицензирование.ПРИМЕЧАНИЕ: Исходная ссылка computerworld.com.au не работает: см. также копии исходного материала на
В настоящее время я портировал bash(1.08) и gcc(1.40), и, похоже, все работает.
дата рождения: воскресенье, 10 января 1988 г. Первоначальный автор: Брайан Фокс
течение полутора лет оболочка GNU была "почти готова". Автор неоднократно давал обещания предоставить то, что он сделал, и никогда их не выполнял. Наконец, я больше не мог верить, что он когда-либо что-либо предоставит. Поэтому сотрудник Фонда Брайан Фокс теперь реализует имитацию оболочки Bourne.
Free Software Foundation написали и поддерживают ряд пакетов программного обеспечения GNU. Два наиболее примечательных из них — библиотека C и оболочка. ... Мы финансировали разработку этих программ, потому что проект GNU был не просто инструментами или средой разработки. Нашей целью была полноценная операционная система, и эти программы были необходимы для этой цели.
В Linux большинство пользователей запускают bash, поскольку это самая популярная оболочка.
Bourne Again Shell (bash) — наиболее распространённая оболочка, устанавливаемая с дистрибутивами Linux.
Bash — безусловно, самая популярная оболочка, которая является оболочкой по умолчанию в системах Linux и Mac OSX.
практически все скрипты настройки и установки, которые поставляются с программами с открытым исходным кодом, написаны для bash, и если вы хотите понять эти скрипты, вам нужно знать bash.
{{cite web}}
: Внешняя ссылка в |website=
( помощь )