Bash (оболочка Unix)

редактировать
Замена GNU для оболочки Bourne

Bash
Gnu-bash-logo.svg
Снимок экрана сеанса Bash Снимок экрана сеанса Bash
Исходный автор ( s) Брайан Фокс
Первый выпуск8 июня 1989 г.; 31 год назад (08.06.1989)
Стабильный выпуск 5.0 (7 января 2019 г.; 21 месяц назад (07.01.2019))
Репозиторий Измените это в Викиданных
Написано вC
Операционной системе
Платформа GNU
Доступно вМногоязычный (gettext )
Тип оболочка Unix, язык команд
Лицензия GPLv3 +
Веб-сайтwww.gnu.org / software / bash /

Bash - это оболочка Unix и командный язык, написанный Брайаном Фоксом для GNU Project в качестве бесплатного программного обеспечения, заменяющего оболочку Bourne. Впервые выпущенный в 1989 году, он использовался как логин по умолчанию оболочка для большинства дистрибутивов Linux и всех выпусков Apple macOS до macOS Catalina. Также доступна версия для Windows 10 через подсистему Windows для Linux. Это также оболочка пользователя по умолчанию в Solaris 11.

Bash - это командный процессор, который обычно запускается в текстовом окне, где пользователь вводит команды, вызывающие действия. Bash также может читать и выполнять команды из файла, который называется сценарием оболочки. Как и все оболочки Unix, он поддерживает имя файла globbing (сопоставление подстановочных знаков), конвейер, здесь документы, подстановка команд, переменные и управляющие структуры для проверки условий и итерации. Ключевые слова , синтаксис, переменные с динамической областью действия и другие базовые функции языка скопированы из sh. Другие функции, например, история, копируются из csh и ksh. Bash - это оболочка, совместимая с POSIX, но с рядом расширений.

Название оболочки является аббревиатурой от Bourne Again Shell, каламбура в названии Bourne shell, которую она заменяет, и понятием "" возрожденная ".

A дыра в безопасности в Bash начиная с версии 1.03 (август 1989 г.), получившая название Shellshock, была обнаружена в начале сентября 2014 г. и быстро привела к ряду атак через Интернет. Патчи для исправления ошибок были доступны вскоре после обнаружения ошибок.

Содержание
  • 1 История
  • 2 Функции
    • 2.1 Расширение скобок
    • 2.2 Запуск скрипты
      • 2.2.1 Пример запуска Bash, совместимого с предыдущими версиями
      • 2.2.2 Проблемы операционной системы при запуске Bash
    • 2.3 Переносимость
    • 2.4 Сочетания клавиш
    • 2.5 Управление процессами
    • 2.6 Условное выполнение
    • 2.7 Сообщение об ошибках
    • 2.8 Программируемое завершение
  • 3 История выпуска
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки
История

Брайан Фокс начал кодирование Баш 10 января 1988 г., после Ричарда Столлмана быть пришел недоволен отсутствием прогресса, достигнутого предыдущим разработчиком. Столлман и Фонд свободного программного обеспечения (FSF) считали свободную оболочку, которая может запускать существующие сценарии оболочки, настолько стратегически важной для полностью бесплатной системы, построенной из кода BSD и GNU, что это был один из немногих проектов, которые они финансировали сами. с Фоксом, выполняющим работу в качестве сотрудника FSF. Фокс выпустил бета-версию Bash версии.99 8 июня 1989 г. и оставался основным сопровождающим до середины 1992 г. и середины 1994 г., когда он был уволен из FSF и его ответственность была передана другому раннему участнику, Chet Ramey.

С тех пор Bash стала самой популярной оболочкой среди пользователей Linux, став интерактивной оболочкой по умолчанию в различных дистрибутивах этой операционной системы (хотя оболочка Almquist может быть оболочка сценариев по умолчанию) и в выпусках MacOS от Apple до Catalina в октябре 2019 года. Bash также был перенесен на Microsoft Windows и распространялся с Cygwin и MinGW, DOS проектом DJGPP, Novell NetWare, OpenVMS проектом GNV, ArcaOS и Android через различные приложения эмуляции терминала.

В сентябре 2014 года Стефан Чазелас, специалист по Unix / Linux, обнаружил в программе ошибку безопасности. Ошибка, впервые обнаруженная 24 сентября, получила название Shellshock и номера CVE - 2014-6271, CVE- 2014-6277 <22.>и CVE- 2014-7169. Ошибка была расценена как серьезная, поскольку скрипты CGI, использующие Bash, могли быть уязвимыми, позволяя выполнять произвольный код. Ошибка была связана с тем, как Bash передает определения функций в подоболочки через переменные среды.

Features

Синтаксис команды Bash является надмножеством языка Bourne. синтаксис команд оболочки. Bash поддерживает расширение скобок, завершение командной строки (программируемое завершение), базовую отладку и обработку сигналов (с использованием trap), начиная с bash 2.05a. среди других функций. Bash может выполнять подавляющее большинство сценариев оболочки Bourne без изменений, за исключением сценариев оболочки Bourne, которые сталкиваются с поведением внешнего синтаксиса, по-разному интерпретируемым в Bash, или пытаются запустить системную команду, соответствующую более новой встроенной программе Bash, и т. Д. Синтаксис команд Bash включает в себя нарисованные идеи. из KornShell (ksh) и оболочки C (csh), например редактирование командной строки, история команд (команда history), стек каталогов, переменные $ RANDOMи $ PPIDи подстановка команды POSIX синтаксис $ (…).

Когда пользователь нажимает клавиша табуляции в интерактивной командной оболочке, Bash автоматически использует завершение командной строки, начиная с бета-версии 2.04, для сопоставления частично типизированных имен программ, имен файлов и имен переменных. Система автозавершения командной строки Bash очень гибкая и настраиваемая, и часто содержит функции, которые завершают аргументы и имена файлов для определенных программ и задач.

Синтаксис Bash имеет множество расширений, отсутствующих в оболочке Bourne. Bash может выполнять целочисленные вычисления («арифметические вычисления») без создания внешних процессов. Для этой цели он использует команду ((…))и синтаксис переменной $ ((…)). Его синтаксис упрощает перенаправление ввода-вывода. Например, он может перенаправить стандартный вывод (stdout) и стандартную ошибку (stderr) одновременно с помощью оператора >. Это проще набрать, чем эквивалент оболочки Bourne 'command>file 2>1'. Bash поддерживает подстановку процессов с использованием синтаксиса <(command)и >(команда), который заменяет вывод (или ввод) команды, где обычно используется имя файла. (Это реализуется с помощью / proc / fd / безымянных каналов в системах, которые это поддерживают, или с помощью временных именованных каналов, если необходимо).

При использовании ключевого слова 'function' объявления функций Bash несовместимы со сценариями Bourne / Korn / POSIX (KornShell имеет ту же проблему при использовании 'function'), но Bash принимает тот же синтаксис объявления функций, что и оболочки Bourne и Korn и совместим с POSIX. Из-за этих и других различий сценарии оболочки Bash редко запускаются под интерпретаторами оболочки Bourne или Korn, если они специально не написаны с учетом этой совместимости, что становится все менее распространенным, поскольку Linux становится все более распространенным. Но в режиме POSIX Bash более точно соответствует POSIX.

Bash поддерживает здесь документы. Начиная с версии 2.05b, Bash может перенаправить стандартный ввод (stdin) из «строки здесь» с помощью оператора <<<.

Bash 3.0 поддерживает соответствие регулярному выражению внутри процесса с использованием синтаксиса, напоминающего Perl.

. В феврале 2009 года Bash 4.0 представил поддержку ассоциативных массивов. Индексы ассоциативных массивов представляют собой строки, аналогичные AWK или Tcl. Их можно использовать для имитации многомерных массивов. Bash 4 также переключает свою лицензию на GPLv3 ; некоторые пользователи подозревают, что это изменение лицензирования является причиной того, что MacOS продолжает использовать более старые версии.

Расширение скобок

Расширение скобок, также называемое чередованием, является функцией, скопированной из оболочки 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

Пользователи не должны использовать расширения скобок в переносимых сценариях оболочки, потому что оболочка Борна не производит такой же вывод.

$ # Традиционная оболочка не производит такой же вывод $ / 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 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, например:

$ start = 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, совместимого с устаревшими версиями

скелет ~ /.bash_profile, указанный ниже, совместим с оболочкой Bourne и дает семантику, аналогичную csh для ~ /.bashrcи ~ /.bash_login. [-r filename] cmd- это оценка короткого замыкания, которая проверяет, существует ли имя файла и доступно для чтения, пропуская часть после , если это не.

[-r ~ /.profile]. ~ /.profile # настроить среду, один раз, синтаксис Bourne-sh, только если [-n "$ PS1"]; then # мы интерактивны? [-r ~ /.bashrc]. ~ /.bashrc # tty / prompt / настройка функции для интерактивных оболочек [-r ~ /.bash_login]. ~ /.bash_login # любые задачи при входе в систему только для оболочки входа fi # Конец блока «if»

Проблемы операционной системы при запуске Bash

Некоторые версии Unix и Linux содержит сценарии запуска системы Bash, обычно в каталогах / etc. Bash вызывает их как часть своей стандартной инициализации, но другие файлы запуска могут читать их в другом порядке, чем задокументированная последовательность запуска Bash. Содержимое по умолчанию файлов пользователя root также может иметь проблемы, как и файлы скелета, которые система предоставляет новым учетным записям пользователей при настройке. Сценарии запуска, которые запускают оконную систему, также могут делать неожиданные вещи с пользовательскими сценариями запуска Bash, пытаясь установить переменные пользовательской среды перед запуском оконного менеджера. Эти проблемы часто можно решить с помощью файла ~ /.xsessionили ~ /.xprofileдля чтения файла ~ /.profile, который предоставляет переменные среды, которые Окна оболочки Bash, порожденные необходимостью диспетчера окон, например xterm или Gnome Terminal.

Portability

Вызов Bash с параметром --posixили указание set -o posixв сценарии приводит к тому, что Bash очень близко соответствует стандарту POSIX 1003.2. Сценарии оболочки Bash, предназначенные для переносимости, должны учитывать как минимум стандарт оболочки POSIX. Вот некоторые особенности bash, которых нет в POSIX:

  • Некоторые расширенные параметры вызова
  • Раскрытие скобок
  • Массивы и ассоциативные массивы
  • Двойные скобки [[...]]расширенная тестовая конструкция и ее соответствие регулярному выражению
  • Конструкция арифметической оценки в двойных скобках (только ((...)); $ ((...))- это POSIX)
  • Определенные операции обработки строк в раскрытии параметров
  • localдля переменных с ограниченной областью действия
  • Подстановка процесса
  • Bash- определенные встроенные функции
  • Совместные процессы
  • переменные $ EPOCHSECONDS и $ EPOCHREALTIME

Если часть кода использует такую ​​функцию, это называется «башизмом» - проблемой для переносимого использования. Чтобы убедиться, что сценарий не содержит этих частей, можно использовать checkbashismsDebian и shellcheckВидара Холена. Список варьируется в зависимости от фактической целевой оболочки: политика Debian допускает некоторые расширения в своих сценариях (например, в dash ), в то время как сценарий, предназначенный для поддержки предварительных POSIX оболочек Bourne, как autoconf, configure, еще более ограничены в возможностях, которые они могут использовать.

Сочетания клавиш

Bash использует строку чтения для предоставления сочетаний клавиш для редактирования командной строки с использованием привязки клавиш по умолчанию (Emacs ). Vi-привязки можно включить, запустив set -o vi.

Управление процессами

Оболочка Bash имеет два режима выполнения команд: пакетный, и параллельный режим.

Для выполнения команд в пакете (т. Е. Последовательно) они должны быть разделены символом «;» или отдельными строками:

command1; command2

в этом примере, когда command1 завершена, command2 выполняется.

[Фоновый процесс | выполнение в фоновом режиме] команды 1 может происходить с использованием (символа ) в конце команды выполнения, и процесс будет выполняться в фоновом режиме, немедленно возвращая управление оболочке и позволяя продолжить выполнение команд.

command1

Или для одновременного выполнения двух command1 и command2 они должны выполняться в оболочке Bash следующим образом:

command1 command2

В этом случае command1 выполняется в background symbol, немедленно возвращая управление оболочке, которая выполняет command2 на переднем плане.

Процесс можно остановить и вернуть управление в bash, набрав Ctrl+z, когда процесс выполняется на переднем плане.

Список всех процессов, находящихся в фоновом режиме и остановлено, может быть достигнуто путем выполнения заданий:

$ jobs [1] - Выполнение command1 [2] + Stopped command2

В выводе число в скобках относится к идентификатору задания. Знак плюс обозначает процесс по умолчанию для bgи fg. Тексты «Выполняется» и «Остановлен» относятся к состоянию процесса. Последняя строка - это команда, запустившая процесс.

Состояние процесса можно изменить с помощью различных команд. Команда fgвыводит процесс на передний план, а bgустанавливает остановленный процесс, работающий в фоновом режиме. bgи fgмогут принимать идентификатор задания в качестве своего первого аргумента, чтобы указать процесс, над которым нужно действовать. Без него они используют процесс по умолчанию, обозначенный знаком плюс в выводе jobs. Команда kill может использоваться для преждевременного завершения процесса, посылая ему сигнал . Идентификатор задания должен быть указан после знака процента:

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 (или, необязательно, на другие адреса электронной почты).

Программируемое завершение

Программируемое завершение в Bash, команды completeи compgenбыли доступны с бета-версии 2.04 в 2000 году. Эти возможности позволяют выполнять сложное интеллектуальное завершение, например, предлагать завершение доступных параметров программы с помощью табуляции а затем, после того, как пользователь выберет параметр, для которого в качестве следующего ввода требуется имя файла, для следующего токена будут автоматически добавлены только пути к файлам (а не другие параметры).

История выпусков
ВЕРСИЯДАТА ВЫПУСКА
bash-5.02019-01-07
bash-5.0-rc12018-12-20
bash-5.0-beta22018-11-28
bash-5.0-beta2018-09-17
bash-5.0 -alpha2018-05-22
bash-4.42016-09-15
bash-4.4-rc22016-08-22
bash-4.4-rc124.02.2016
bash-4.4-beta22016-07-11
bash-4.4-beta2015-10-12
bash-4.32014-02-26
bash-4.22011-02-13
bash-4.131 декабря 2009
bash-4.02009-02-20
bash-4.0-rc12009-01-12
bash-3.211.10.2006
bash-3.12008-12-08
bash-3.02004-08-03
bash-2.05 b2002-07-17
bash-2.05a2001-11-16
bash-2.052001-04-09
bash-2.042000-03-21
bash-2.031999-02-19
bash-2.021998-04-18
bash-2.011997-06-05
bash-2.01996-12-31
См. Также
  • Портал бесплатного программного обеспечения и программного обеспечения с открытым исходным кодом
Ссылки
Внешние ссылки
Викискладе есть носители, связанные с Bash.
В Wikibooks есть книга на тему: Bash Shell Scripting
Последняя правка сделана 2021-05-11 13:51:14
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте