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

GNU-заменитель оболочки Bourne

Баш
Оригинальный автор(ы)Брайан Фокс
Разработчик(и)Чет Рэми
Первоначальный выпуск8 июня 1989 г .; 35 лет назад ( 8 июня 1989 )
Стабильный релиз
5.2.37 [1]  / 23 сентября 2024 г.
Репозиторий
  • git.savannah.gnu.org/gitweb/?p=bash.git
Написано вС
Операционная система
ПлатформаГНУ
Доступно вМногоязычный ( 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]

Хронология

1963 ( 1963 )
Во время работы в Массачусетском технологическом институте над операционной системой Compatible Time-Sharing System Луи Пузен написал «' RUNCOM ' , своего рода оболочку, управляющую выполнением командных скриптов с заменой аргументов». Он «считал, что команды должны использоваться в качестве строительных блоков для написания большего количества команд, как библиотеки подпрограмм». [17]
1964 ( 1964 )
Разработка MULTICS началась в Массачусетском технологическом институте.
1965 ( 1965 )

« Кристофер Стрейчи , британский ученый, посетил Массачусетский технологический институт примерно в то же время, и его проект макрогенератора показался мне очень прочной основой для командного языка, в частности, методов цитирования и передачи аргументов. Не будучи приглашенным по этой теме, я написал статью, объясняющую, как можно разработать командный язык Multics с этой целью. И я придумал слово «shell» для его названия». [17]

  • 2 апреля 1965 г .: Массачусетский технологический институт, «SHELL, глобальный инструмент для вызова и объединения процедур в цепочку в системе», Луи Пузен. [18] ( 1965-04-02 )
  • «Она (т. е. оболочка Томпсона) была смоделирована по образцу оболочки Multics, разработанной в 1965 году американским инженером-программистом Глендой Шредер . Сама оболочка Multics Шредера была смоделирована по образцу программы RUNCOM, которую Луи Пузен показал команде Multics.
1969 ( 1969 )
Операционная система MULTICS была представлена ​​в результате сотрудничества MIT, GE и Bell Labs. «Она также стала первой, в которой командный процессор был реализован как обычный пользовательский код — идея, которая позже была использована в оболочке Unix».Multics Wikipage Она называлась exec_com или ec. [19] [20]
1971 ( 1971 )
«Кен Томпсон (из Bell Labs) разработал первую оболочку для UNIX под названием «V6 shell». Единственной ее целью было служить в качестве интерактивной оболочки. Она поддерживала внешние команды, называемые glob, для сопоставления с образцом, и if, для условных выражений. «Оболочка представила компактный синтаксис для перенаправления ( < >и >>) и конвейеризации ( |или ^), который сохранился в современных оболочках. Вы также можете найти поддержку для вызова последовательных команд (с ;) и асинхронных команд (с &).» [16] Она также включала команду goto.
1973 ( 1973 )
UNIX, первоначально написанный Кеном Томпсоном, Деннисом Ритчи и Брайаном Керниганом среди прочих, был выпущен компанией AT&T (страница UNIX в Википедии).
1975 ( 1975 )
  • Сентябрь 1975 г .: Digital Equipment Corporation выпустила VT52, который «обеспечивал экран с 24 строками и 80 столбцами текста и поддерживал все 95 символов ASCII, а также... двунаправленную прокрутку» и, в отличие от своего предшественника VT50, поддерживал строчные буквы ( VT52 ). (1975-09)
1977 (1977)
  • Американский национальный стандартный код для обмена информацией, или «ASCII», опубликован Национальным институтом науки и технологий, или «NIST», как FIPS PUB 1-2. [21] Набор символов ASCII по-прежнему используется нами сегодня как основной компонент написания переносимых сценариев оболочки.
  • "Оболочка Bourne была представлена... Созданная Стивеном Борном в AT&T Bell Labs для V7 UNIX, [она] остается полезной оболочкой и сегодня (в некоторых случаях как корневая оболочка по умолчанию)". "Bourne ввел потоки управления, циклы и переменные в скрипты, предоставив более функциональный язык для взаимодействия с операционной системой (как интерактивно, так и неинтерактивно). Оболочка также позволяла использовать скрипты оболочки в качестве фильтров, обеспечивая интегрированную поддержку обработки сигналов, но не имела возможности определять функции. Наконец, она включала ряд функций, которые мы используем сегодня, включая подстановку команд (с использованием обратных кавычек) и документы HERE для встраивания сохраненных строковых литералов в скрипт". [16] Она использовала стиль -eq, -ne, -lt тестовых операторов
  • Оболочка Korn была представлена ​​примерно в то же время, что и оболочка Bourne. Она предоставляет некоторые функции, заимствованные из Python и Ruby, такие как ассоциативные массивы и арифметика с плавающей точкой, и нацелена на поддержку нового стандарта POSIX. [16] К ее функциям относятся оператор проверки -ne и синтаксис проверки `[...]`, команда "for ... in", арифметический синтаксис `$((...))`, знакомый синтаксис позиционных параметров, подстановка команд и команда псевдонима.
  • OpenVMS — начальный выпуск. [22] Позднее он включал Bash.
1978 (1978)
  • C shell — начальный выпуск. Создан Биллом Джоем, когда он был в Беркли, и выпущен вместе с 2BSD. «Полезной функцией, представленной Биллом Джоем в C shell, была история команд. Эта функция поддерживала историю ранее выполненных команд и позволяла пользователю просматривать и легко выбирать предыдущие команды для выполнения. Например, ввод истории команд покажет ранее выполненные команды. Клавиши со стрелками вверх и вниз можно использовать для выбора команды, или предыдущая команда может быть выполнена с помощью !!. Также можно ссылаться на аргументы предыдущей команды; например, !* ссылается на все аргументы предыдущей команды, где !$ ссылается на последний аргумент предыдущей команды». [16] «csh, tcsh, zsh, ash и scsh выпущены под лицензией BSD или подобной BSD».
  • Август 1978 года : корпорация Digital Equipment представила VT100 . (1978-08)
1983 (1983)
  • Оболочка TENEX C "ввела имя файла и завершение команды в дополнение к функциям редактирования командной строки. tcsh была разработана Кеном Гриром в Университете Карнеги-Меллона". [16] Символ shebang или hashbang был доступен в tcsh. Также позиционные параметры как массив argv, включая argv[1], переменная оболочки $0 как argv[0], расширение параметра Count of Indices $#var, операторы -d и -x тестового синтаксиса относительно каталога и тестов исполняемости, соответственно, символ отрицания !, циклическая конструкция в команде foreach, команды set, echo и exit, назначение переменных и арифметические контексты "@ count = $count + 1" и знакомые правила двойных кавычек.
  • Novell NetWare - Первоначальный выпуск. В какой-то момент он включал Bash.
1984 (1984)
«Работа IEEE POSIX началась в 1984 году как результат работы, начатой ​​в организации /usr/group с целью создания стандарта для двух версий UNIX того времени — версии 6 и BSD (Беркли)». [23]
1986 (1986)
Документы, которые стали известны как «POSIX», изначально были стандартом пробного использования IEEE. Некоторые считают его фактическим стандартом. [24]
1988 (1988)
  • 10 января 1988 г .: Брайан Фокс начал писать код для Bash [25] после того, как Ричард Столлман был недоволен отсутствием прогресса, достигнутым предыдущим разработчиком. [26] Столлман и FSF посчитали свободную оболочку, которая могла бы запускать существующие скрипты оболочки, настолько стратегически важной для полностью свободной системы, построенной из кода BSD и GNU, что это был один из немногих проектов, которые они финансировали сами. Фокс взялся за эту работу как сотрудник FSF. [26] [27] (1988-01-10)
  • «Первая версия IEEE Std 1003 была опубликована в 1988 году под названием «IEEE IX», но эти стандарты не определяли требования к «командному интерпретатору» или «оболочке и утилитам» до недавнего времени. «По предложению Ричарда Столлмана это было изменено на POSIX для «переносимого интерфейса операционной системы». [23] [28] Интерфейс POSIX «позволяет разработчикам приложений писать переносимые приложения — он был разработан с этой целью». [29]
1989 (1989)
  • 30 мая 1989 г .: Ясеневая оболочка Кеннета Алмквиста — Первоначальный выпуск. [30] (1989-05-30)
  • 8 июня 1989 г .: Fox выпустила Bash в качестве бета-версии, версии 0.99. [8] Лицензия была GPL-1.0 или более поздней. «В дополнение к поддержке обратной совместимости для написания скриптов, Bash включил функции из оболочек Korn и C. Вы найдете историю команд, редактирование командной строки, стек каталогов (pushd и popd), множество полезных переменных окружения, завершение команд и многое другое». [16] В конечном итоге он поддерживал «регулярные выражения (похожие на Perl) и ассоциативные массивы». (1989-06-08)
  • Microsoft/IBM DOS через проект DJGPP — Первоначальный выпуск.
1992 (1992)
  • Опубликован POSIX.2: Shell and Utilities (IEEE Std 1003.2-1992).
  • Брайан Фокс оставался основным сопровождающим до середины 1992 [31] и середины 1994 года. [32] [33] Затем его обязанности перешли к другому раннему участнику, Чету Рэми. [34] С тех пор Bash стал самой популярной интерактивной оболочкой по умолчанию среди основных дистрибутивов GNU/Linux, таких как Fedora , Debian и openSUSE , а также среди их производных и конкурентов. [35] [36]
1992 (1992)
«Первые восемь записей в (POSIX) Portable Character Set определены в стандарте ISO/IEC 6429:1992». Это null, alert, backspace, tab, cart-return, newline, vertical-tab и form-feed. [37]
1994 (1994)
  • 26 января 1994 г .: Debian — первый релиз. Bash — интерактивная и неинтерактивная оболочка по умолчанию. [38] (1994-01-26)
1995 (1995)
  • Cygwin — первый выпуск.
  • BeOS — Первоначальный выпуск. [39] [40]
1996 (1996)
  • 31 декабря 1996 г .: Чет Рэми выпустил bash 2.0. Лицензия GPL-2.0 или более поздняя. (1996-12-31)
1997 (1997)
  • 5 июня 1997 г .: Выпущен Bash 2.01. (1997-06-05)
  • Оболочка Almquist, ash, портированная из NetBSD в Debian Гербертом Сю.
1998 (1998)
  • 18 апреля 1998 г .: Выпущен Bash 2.02. (1998-04-18)
  • MinGW (32-бит) — первый выпуск.
  • Группа комитетов по стандартам из IEEE, Open Group и ISO/IEC начала работу над Single UNIX Specification v 3; вместе они стали известны как Austin Group. Технический стандарт для Shell и Utilities был создан в The Open Group Base Specifications, Issue 6, который сам по себе является частью Single UNIX Specification v 3. [41] Основное внимание в их работе было сосредоточено на том, чтобы «собрать в один документ» практики, которые, как было доказано, работают в промышленности и академических кругах, при этом внеся «минимальные изменения в существующий код приложения». [29]
1999 (1999)
  • 19 февраля 1999 г .: Выпущен Bash 2.03. (1999-02-19)
2000 (2000)
  • 21 марта 2000 г .: Выпущен Bash 2.04. (2000-03-21)
  • Оболочка Korn распространяется с открытым исходным кодом под лицензией Common Public License.
  • «Остальные символы» в наборе переносимых символов POSIX «определены в стандарте ISO/IEC 10646-1:2000». Они включают в себя оставшиеся символы на американской qwerty-клавиатуре от <пробел> до <тильды>. [37]
  • BeOS - Финальный релиз
  • Darwin OS - Первоначальный выпуск. Bash - одна из доступных оболочек. [16]
  • 14 сентября 2000 г .: Существует список рассылки Bug-bash. [42] (2000-09-14)
2001 (2001)
  • 9 апреля 2001 г .: выпущен Bash 2.05. [43] (2001-04-09)
  • Опубликован стандарт POSIX-2001, включающий раздел «Команды и утилиты». В этом участвуют Austin Group и Single Unix Specification. [41]
2002 (2002)
  • Сентябрь 2002 г .: В Debian версия 0.4.1 ash была переименована в dash. (2002-09)
2003 (2003)
  • Bash стал оболочкой по умолчанию в операционных системах Apple (например, MacOS), начиная с OS X 10.3 Panther. [44] [45] Он был также доступен в OS X 10.2 Jaguar, где оболочкой по умолчанию была tcsh.
  • Стандарт оболочки и утилит POSIX-2003 опубликован IEEE. «Это стандарт компонента продукта для обязательной оболочки и утилит, связанных с функциональностью»; существует программа сертификации POSIX. [46]
2004 (2004)
  • 27 июля 2004 г .: Выпущен Bash 3.0. [47] (2004-07-27)
  • Опубликован POSIX-2004. [48]
2005 (2005)
  • 9 декабря 2005 г .: Выпущен Bash 3.1. [49] (2005-12-09)
  • Mingw-w64 — Первоначальный выпуск.
2006 (2006)
  • 12 октября 2006 г .: выпущен Bash 3.2. [50] Лицензия — GPL-2.0 или более поздняя. (2006-10-12)
  • Ubuntu использует Dash в качестве оболочки по умолчанию.
2008 (2008)
IEEE выпускает POSIX-2008. «Этот стандарт определяет стандартный интерфейс исходного уровня для оболочки и служебных функций, требуемых прикладными программами, включая скрипты оболочки». [46]
2009 (2009)
  • 20 февраля 2009 г .: Выпущен Bash 4.0. [51] Лицензия — GPL-3.0 или более поздняя. (2009-02-20)
  • Novell Netware - финальная версия
  • 14 сентября 2009 г .: Haiku (операционная система) — первый выпуск. [52] «Интерфейс оболочки Haiku по умолчанию» — bash. [53] По состоянию на 13 сентября 2024 г. Haiku остаётся в стадии бета-тестирования. [54] (2009-09-14)
2011 (2011)
  • 2 января 2010 г .: Выпущен Bash 4.1. [55] (2010-01-02)
  • 6 февраля 2011 г .: Выпущен Debian Lenny с Bash в качестве интерактивной оболочки по умолчанию и dash в качестве неинтерактивной оболочки по умолчанию. [38] «Dash не имеет многих функций, которые можно было бы ожидать от интерактивной оболочки, что позволяет ему работать быстрее и эффективнее использовать память, чем Bash». (2011-02-06)
  • 14 февраля 2011 г .: Выпущен Bash 4.2. [56] (2011-02-14)
2012 (2012)
В Solaris 11 «пользовательской оболочкой по умолчанию является оболочка Bourne-again (bash)» [57] .
2013 (2013)
POSIX-2013 выпущен IEEE. [58]
2014 (2014)
2015 (2015)
Termux и другие приложения эмуляции терминала обеспечивают доступность Bash на Android .
2016 (2016)
  • 26 апреля 2016 г .: Windows 10 Insider Preview Build 14332 поддерживает установку Bash на Ubuntu в недавно выпущенной подсистеме Windows для Linux . [62] [63] (2016-04-26)
  • POSIX-2016 выпущен IEEE. [64]
  • 15 сентября 2016 г .: Выпущен Bash 4.4. (2016-09-15)
2017 (2017)
  • Выпущена новая версия стандарта POSIX. [46]
  • Некоторые другие современные операционные системы, поддерживающие Bash, включают и ArcaOS . [65]
2018 (2018)
  • 31 января 2018 г .: IEEE опубликовал стандарт POSIX 2017. [66] (2018-01-31)
  • Apple упаковывала Bash в качестве своей интерактивной оболочки по умолчанию вплоть до macOS Mojave (около 2018 г.). Однако по явным причинам лицензирования с Catalina [67] (около 2019 г.) Apple заменила свою оболочку по умолчанию, Bash версии 3.2 (около 2006 г.), на Z Shell версии 5.7 (около 2019 г.). [68] [69] «Двоичный файл bash, поставляемый с macOS, уже долгое время застрял на версии 3.2. bash v4 был выпущен в 2009 г., а bash v5 — в январе 2019 г. Причина, по которой Apple не перешла на эти новые версии, заключается в том, что они лицензированы с помощью GPL v3. bash v3 по-прежнему имеет лицензию GPL v2». [67] Zsh использует более разрешительную лицензию. [70]
2019 (2019)
  • 7 января 2019 г .: Выпущен Bash 5.0. [71] (2019-01-07)
2020 (2020)
  • С выпуском 2020.4 Kali Linux перешла на zsh в качестве оболочки по умолчанию для образов рабочего стола, но образы ARM, контейнеров, NetHunter и WSL по-прежнему используют Bash. [72]
  • 7 декабря 2020 г .: Выпущен Bash 5.1. [73] (2020-12-07)
2022 (2022)
  • 26 сентября 2022 г .: Выпущен Bash 5.2. [74] (2022-09-26)
  • «На данный момент, в 2022 году, значительное количество совместимых с POSIX или находящихся под его влиянием систем существует на серверах, в облачных вычислительных центрах, высокопроизводительных компьютерах, системах Apple (первоначально вариациях BSD) и во многих системах сотовой связи. Количество устройств измеряется миллиардами». [23]
2023 (2023)
2024 (2024)
  • 14 июня 2024 г .: IEEE публикует стандарт POSIX-2024. (2024-06-14)

Функции

Список кратких описаний

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

  • Руководство пользователя, предоставленное проектом GNU, также доступно по адресу info bash, а техническое руководство доступно по адресу man bash.
  • Призыв как...
  • Интерфейс командной строки ;
  • Коды статуса выхода ;
  • Структуры управления для
  • Синтаксисы для логического тестирования атрибутов файлов, строковых и целочисленных значений и т. д.:
    • Традиционное testкомандование,
    • Традиционный тест с одной скобкой: [,
    • Современный тест двойной скобки: [[ ... ]], включающий расширенные функции:
  • Конвейеры в стиле UNIX : |;
  • Подоболочки : ( ... );
  • Сигнализация как средство межпроцессного взаимодействия с использованием trapвстроенных средств;
  • Асинхронное выполнение, т. е. задания и управление заданиями :
    • job_spec &где job_specможет быть одно из:
      • Полная командная строка: <command_name> <options> <operands> <arguments> &, или
      • Идентификатор управления заданием, обозначенный начальным символом процента: %1 &;
  • Режим переносимости оболочки , в котором командные строки могут интерпретироваться в соответствии со стандартом POSIX ;
  • Разбор команды:
    • Комментарии игнорируются:
      • Комментарии с хэштегом в стиле Борна #и
      • :Комментарии в стиле Томпсона с двоеточием;
    • Команды анализируются по одной строке за раз:
      • Структуры контроля уважаются, и
      • Экранирование с помощью обратной косой черты \также допускается в конце строк;
    • Разделить на слова (т.е. разбиение слов ) в соответствии с правилами цитирования ,
      • Включая цитирование ANSI-C $'...';
    • Над полученной строкой выполняется семь видов расширений в следующем порядке:
    • Выполняются перенаправления потоков данных стандартного ввода, стандартного вывода и стандартной ошибки , в том числе
      • Запись файлов, >, и добавление, >>,
      • Здесь документы , <<,
      • Здесь строки <<<, которые позволяют использовать параметры в качестве входных данных, и
      • Оператор перенаправления, >|который может принудительно перезаписать файл, если в оболочке включена настройка «noclobber»;
    • Поиск имени команды выполняется в следующем порядке:
    • Полученная строка выполняется как команда.

Bash также предлагает...

  • Настраиваемые среды выполнения: [77]
    • Файлы запуска оболочки и сеанса,~/.bashrc такие как и ~/.profile(т. е. dotfiles );
    • Настройки ( set встроенные ) и параметры оболочки ( shopt встроенные ), которые изменяют поведение оболочки;
  • Поддержка Юникода ;
  • Только с интерактивным вызовом,
  • Легкое ведение журнала для отладки (xtrace) и другие легкие варианты отладки (errexit, noexec, nounset, pipefail и т. д.);
  • Режимы совместимости оболочки : bash 5.1 может работать так же, как bash 4.2 и т. д.;
  • Различные встроенные команды:
    • cd
    • pwd
  • Документация:
    • Встроенная helpкоманда.
    • Страница руководства и
    • Информационная страница , которая аналогична руководству GNU;
  • Неформальные пути поддержки через:
    • IRC на libera.chat #bash
    • Списки рассылки по адресу https://www.gnu.org/software/bash/

Общее обсуждение

Синтаксис команд Bash является надмножеством синтаксиса команд оболочки Bourne. Bash поддерживает раскрытие фигурных скобок , [78] завершение командной строки (программируемое завершение), [79] базовую отладку [80] [81] и обработку сигналов (используя trap) начиная с bash 2.05a [82] [83] среди других функций. Bash может выполнять подавляющее большинство сценариев оболочки Bourne без изменений, за исключением сценариев оболочки Bourne, которые сталкиваются с поведением синтаксиса fringe, интерпретируемым по-разному в Bash, или пытаются запустить системную команду, соответствующую более новой встроенной команде Bash и т. д. Синтаксис команд Bash включает идеи, взятые из оболочки Korn (ksh) и оболочки C (csh), такие как редактирование командной строки, история команд ( historycommand), [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 ...;ficase $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

Переносимость с POSIX

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

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

Если фрагмент кода использует такую ​​функцию, это называется «башизмом» — проблемой для переносимого использования. 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      

Настраиваемая среда(ы) выполнения

Файлы запуска оболочки и сеанса (также известные как «файлы точек»)

При запуске Bash он выполняет команды из множества dot-файлов . [98] В отличие от сценариев оболочки Bash, dot-файлы обычно не имеют ни разрешений на выполнение, ни директивы интерпретатора, например #!/bin/bash.

Пример запуска 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"                             
Проблемы операционной системы при запуске Bash

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

Настройки и параметры оболочки

Встроенныйset
  • Xtrace: [ 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 ↹

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

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 по умолчанию выполнит заданную командную строку, используя встроенный файл оболочки. Указание абсолютного пути к двоичному исполняемому файлу (т. е. ) является одним из способов обеспечения того, чтобы оболочка использовала системный двоичный файл. Эта проблема конфликта имен также влияет на любые «справочные сводки», просматриваемые с помощью и . Встроенные файлы оболочки и системные двоичные исполняемые файлы с одинаковым именем часто имеют разные параметры.printftesttrue/bin/printfkill --help/bin/kill --help

«У сопровождающего проекта также есть страница Bash, которая включает в себя часто задаваемые вопросы» [109] [108] этот FAQ актуален для версии bash 5.1 и больше не обновляется.

Безопасность и уязвимости

Корневые скрипты

Запуск любых скриптов оболочки от имени пользователя root в течение многих лет широко критиковался как плохая практика безопасности. Одной из часто упоминаемых причин является то, что при запуске скрипта от имени пользователя root негативные последствия любых ошибок в скрипте будут усилены повышенными привилегиями пользователя root.

Один распространенный пример: скрипт содержит команду rm -rf ${dir}/, но переменная $dirостается неопределенной. В Linux, если скрипт был выполнен обычным пользователем, оболочка попытается выполнить команду rm -rf /как обычный пользователь, и команда не будет выполнена. Однако, если скрипт был выполнен пользователем root, то команда, скорее всего, будет выполнена успешно, и файловая система будет стерта.

Вместо этого рекомендуется использовать его sudoдля каждой команды.

Отладка

Возможности Bash, которые могут быть полезны при отладке.
ОсобенностьPOSIX 2024ОписаниеBash-версия.
Тип грамматикиОфициальное названиеСинтаксис
Расширение параметровУказать ноль или неустановлено"${parameter:?[word]}"Да«Где расширение [слова], возможно, сообщение об ошибке или номер строки, записывается в STDERR, и оболочка завершается с ненулевым кодом выхода».?
Специальные параметрыСтатус выхода"$?"Да«Расширяется до кратчайшего представления десятичного статуса выхода».?
Специальные параметрыPID вызванной оболочки"$$"Да«Расширяется до кратчайшего представления десятичного идентификатора процесса вызванной оболочки».?
Специальная встроенная утилитанабор :: xtraceset -xДаОсновное средство отладки оболочки . Она «записывает в стандартный поток ошибок трассировку для каждой команды после ее раскрытия и перед ее выполнением».?
Специальная встроенная утилитанабор :: подробныйset -vДа«Записывает входные данные в стандартный поток ошибок по мере их чтения».?
Специальная встроенная утилитанабор :: pipefailset -o pipefailДа«Выведите статус завершения конвейера из статусов завершения всех команд в конвейере, а не только последней (самой правой) команды».?
Специальная встроенная утилитанабор :: набор существительныхset -uДаПри включении приведет к выходу оболочки с сообщением об ошибке при обнаружении неустановленного расширения переменной. Его использование имеет ряд контринтуитивных ловушек.?
Специальная встроенная утилитаустановить :: errexitset -eДаErrExit — это параметр, который при включении при определенных, очень специфических условиях заставит оболочку завершить работу без сообщения об ошибке, когда оболочка получает ненулевой код выхода. Его использование несколько спорно, в той степени, в которой любая малоизвестная компьютерная программа может считаться спорной. Сторонники утверждают, что ErrExit обеспечивает гарантию проверяемости в ситуациях, когда скрипты оболочки «не должны давать сбой». Однако противники утверждают, что его использование ненадежно, обманчиво просто, крайне нелогично, изобилует подводными камнями и подводными камнями и, по сути, является «театром безопасности». Многочисленные разработчики Bash настоятельно не одобряют использование этого конкретного параметра.?
Специальная встроенная утилиталовушка :: ВЫХОДtrap '[arg]' EXITДа«Если [sigspec] (спецификатор сигнала) равен 0 или EXIT, [arg] выполняется при выходе из оболочки». Если [arg] содержит расширения, то [arg] следует заключить в одинарные кавычки.?
Утилитаprintfprintf '<%s>\n' "${var}"ДаСредство надежной печати содержимого переменной.?
Переменные BashБАШПИД"${BASHPID}"Нет«Расширяется до идентификатора текущего процесса bash». [110]?
Переменные BashBASH_ARGC"${BASH_ARGC[@]}"Нет«Переменная массива, значения которой представляют собой количество параметров в каждом кадре текущего стека вызовов выполнения bash». [111]?
Переменные BashBASH_ARGV"${BASH_ARGV[@]}"Нет«Переменная массива, содержащая все параметры в текущем стеке вызовов выполнения bash». [112]?
Переменные BashBASH_LINENO"${BASH_LINENO[@]}"Нет«Переменная массива, элементы которой являются номерами строк в исходных файлах, где был вызван каждый соответствующий элемент FUNCNAME». [113]?
Переменные BashBASH_REMATCH"${BASH_REMATCH[@]}"Нет«Переменная массива, элементы которой назначаются бинарным оператором =~ условной команде [[». [114]?
Переменные BashBASH_ИСТОЧНИК"${BASH_SOURCE}"Нет«Переменная массива, элементы которой являются именами исходных файлов, в которых определены соответствующие имена функций оболочки в переменной массива FUNCNAME». [115]?
Переменные BashBASH_XTRACEFD"${BASH_XTRACEFD}"Нет«Если задано целое число, соответствующее допустимому файловому дескриптору, Bash запишет вывод трассировки, сгенерированный при включении 'set -x', в этот файловый дескриптор». [116]?
Переменные BashEPOCHREALTIME"${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 :: extdebugshopt -s extdebugНет«Поведение, предназначенное для использования отладчиками».?
Встроенная оболочкаловушка :: ОТЛАДКАtrap '[arg]' DEBUGНет«Если sigspec имеет значение DEBUG, команда arg выполняется перед» определенными видами команд.?
Встроенная оболочкаловушка :: ERRtrap '[arg]' ERRНет«Если sigspec равен ERR, команда arg выполняется всякий раз, когда...» определенные виды команд «возвращают ненулевой статус выхода», при этом действуют такие же ограничения, как и для ErrExit.?
Встроенная оболочкаловушка :: ВОЗВРАТtrap '[arg]' RETURNНет«Если sigspec равен RETURN, команда arg выполняется каждый раз, когда завершается выполнение функции оболочки или скрипта, запущенного с помощью встроенных функций . или source».?


  • Возможности оболочки, определенные POSIX:
    • Расширения параметров: [123]
    • Специальные параметры: [124] [125]
    • Специальная встроенная утилита set: [126] [127]
    • Специальная встроенная утилита : [128] [127]trap [-lp] [arg] [sigspec ]
    • Утилита printf: средство надежной печати содержимого переменной:
  • Возможности Bash, не определенные POSIX:
    • Переменные Bash: [129] [130]
    • Встроенная оболочка set: [126] [127]
    • Встроенная оболочка shopt: [131] [127]
    • Встроенные функции оболочки : [128] [127] Хотя POSIX определяет некоторые варианты использования встроенных функций, следующие спецификации сигналов являются расширениями Bash.trap [-lp] [arg] [sigspec ]trap
  • Утилиты отладки сторонних разработчиков:
    • ShellCheck: Инструмент анализа скриптов оболочки; [132] [96]
    • devscripts-checkbashisms: Проверка того, содержит ли скрипт /bin/sh какие-либо общие конструкции, специфичные для bash; [133] [95]
    • kcov: Инструмент покрытия кода без специальных опций компиляции; [134]
    • Bashdb: символьный отладчик Bash. [135] [136]

Примеры

При :?расширении параметров неустановленная или нулевая переменная может остановить выполнение скрипта.

  • бывш.ш
    #!/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 ' )   

Печать сообщения об ошибке при возникновении проблемы.

  • ошибка.sh
    если  !  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

Устаревший синтаксис

  • Подстановка команд в стиле обратных кавычек: `...`устарела в пользу $(...);
  • Использование -a или -o в командах 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]


Смотрите также

Оболочки Unix

Дальнейшее чтение

  • Пузен, Луи (2 апреля 1965 г.). «SHELL: глобальный инструмент для вызова и сцепления процедур в системе» (PDF) . mit.edu . MIT . Получено 5 января 2024 г. .
  • Стивенсон, Нил (2003). В начале... была командная строка . HarperCollins. ISBN 978-0380815937.
  • «Эволюция оболочек в Linux». ibm.com . Получено 19 мая 2024 г. .
  • «Справочник по написанию сценариев :: Написание сценариев с помощью оболочки Bourne-Again (Bash)». berkeley.edu . Получено 19 мая 2024 г. .
  • "IRIS :: Учебные и исследовательские информационные системы :: FAQ: Unix :: Об оболочках UNIX". berkeley.edu . Получено 19 мая 2024 г.
  • "Изучение оболочки Bash, 2e" . Получено 14 января 2025 г. В этой книге описывается последняя версия bash 2.0 (версия 2.01, датированная июнем 1997 г.).


Ссылки

  1. ^ "Index of /gnu/bash" . Получено 4 декабря 2024 г. .
  2. ^ Проект GNU . "Файл README". Архивировано из оригинала 26 апреля 2019 г. Получено 16 апреля 2014 г. Bash — это свободное программное обеспечение, распространяемое в соответствии с условиями Стандартной общественной лицензии [GNU], опубликованной Free Software Foundation, версии 3 Лицензии (или любой более поздней версии).
  3. ^ "bash-1.11". oldlinux.org . Архивировано из оригинала 15 октября 2021 г. . Получено 9 июня 2021 г. . См. test.c для GPL-2.0-или-более поздней версии
  4. ^ ab "BashFAQ/061 - Greg's Wiki". mywiki.wooledge.org . Архивировано из оригинала 2 марта 2021 г. . Получено 1 марта 2021 г. .
  5. ^
    • "bash-1.05.tar". oldlinux.org .
    • «Есть ли способ загрузить предположительно первоначальный исходный код bash bash-0.99?». unix.stackexchange.com .
  6. ^
    • Ричард Столлман (12 ноября 2010 г.). «О проекте GNU». Free Software Foundation . Архивировано из оригинала 24 апреля 2011 г. Получено 13 марта 2011 г.«Bourne Again Shell» — это игра слов с названием Bourne Shell , которое было обычной оболочкой в ​​Unix.
    • Gattol, Markus (13 марта 2011 г.), Bourne-again Shell, архивировано из оригинала 9 марта 2011 г. , извлечено 13 марта 2011 г. Название представляет собой игру слов на названии оболочки Bourne (sh), ранней и важной оболочки Unix, написанной Стивеном Борном и распространявшейся с версией 7 Unix около 1978 года, и концепции «рождения заново».
  7. ^ "Bourne shell". ibm.com . Получено 19 мая 2024 г. Bourne shell — это интерактивный командный интерпретатор и командный язык программирования.
  8. ^ ab Brian Fox (переслал Leonard H. Tower Jr.) (8 июня 1989 г.). "Bash находится в стадии бета-релиза!". Группа новостей : gnu.announce. Архивировано из оригинала 4 мая 2013 г. Получено 28 октября 2010 г.
  9. ^ "GNU in a Nutshell". gnu.org . Получено 19 мая 2024 г. Конечная цель — предоставить свободное программное обеспечение для выполнения всех задач, которые хотят выполнять пользователи компьютеров, и таким образом оставить проприетарное программное обеспечение в прошлом.
  10. ^ "Free Software Foundation — совместная работа ради свободного программного обеспечения — Главная страница". fsf.org . Получено 19 мая 2024 г. Free Software Foundation (FSF) — некоммерческая организация с всемирной миссией по содействию свободе пользователей компьютеров.
  11. ^ "GNU Software". gnu.org . Получено 19 мая 2024 г. GNU — это операционная система, которая на 100% является свободным программным обеспечением.
  12. ^ "GNU's Bulletin, vol. 1 no. 7, June, 1989 :: GNU's Who". gnu.org . Получено 19 мая 2024 . Брайан Фокс завершил версию sh от GNU, названную BASH, `Bourne Again SHell'.
  13. Гамильтон, Наоми (30 мая 2008 г.), «Языки программирования от А до Я: оболочка BASH/Bourne-Again», Computerworld : 2, заархивировано из оригинала 6 июля 2011 г. , извлечено 21 марта 2011 г. Когда Ричард Столлман решил создать полную замену для тогда еще обремененных систем Unix, он знал, что в конечном итоге ему придется иметь замены для всех распространенных утилит, особенно стандартной оболочки, и эти замены должны будут иметь приемлемое лицензирование. ПРИМЕЧАНИЕ: Исходная ссылка computerworld.com.au не работает: см. также копии исходного материала на
    • readthedocs.io,
    • computerworld.com.au и
    • Университет Южной Каролины.
  14. ^ Торвальдс, Линус Бенедикт (август 1991 г.). "comp.os.minix" . Получено 6 сентября 2009 г. В настоящее время я портировал bash(1.08) и gcc(1.40), и, похоже, все работает.
  15. ^ "Bash FAQ, версия 4.14". Архивировано из оригинала 1 сентября 2018 г. Получено 9 апреля 2016 г.
  16. ^ abcdefgh IBM, Linux Shells
  17. ^ Луи Пузен, Мультицианы, Происхождение раковины
  18. ^ [1]
  19. ^ Мультицианы, Unix
  20. ^ История Multics, информационный сегмент на exec_com
  21. ^ NIST, ASCII публикация, PDF c1977
  22. ^ "Установка новых пакетов GNU". Архивировано из оригинала 3 октября 2020 г. Получено 4 сентября 2020 г.
  23. ^ abc Влияние POSIX
  24. ^ Usenix ';login:' февраль 2007 г.
  25. Брайан Фокс (29 августа 1996 г.), shell.c, Free Software Foundation , архивировано из оригинала 28 сентября 2018 г. , извлечено 1 ноября 2010 г. , дата рождения: воскресенье, 10 января 1988 г. Первоначальный автор: Брайан Фокс
  26. ^ ab Richard Stallman (переслано с комментариями Chet Ramey) (10 февраля 1988 г.). "GNU + BSD = ?". Группа новостей : comp.unix.questions. Usenet:  2362@mandrill.CWRU.Edu. Архивировано из оригинала 28 декабря 2021 г. Получено 28 декабря 2021 г. В течение полутора лет оболочка GNU была "почти готова". Автор неоднократно давал обещания предоставить то, что он сделал, и никогда их не выполнял. Наконец, я больше не мог верить, что он когда-либо что-либо предоставит. Поэтому сотрудник Фонда Брайан Фокс теперь реализует имитацию оболочки Bourne.
  27. ^ Ричард Столлман (3 октября 2010 г.). "О проекте GNU". Free Software Foundation . Архивировано из оригинала 24 апреля 2011 г. Получено 21 марта 2011 г. Сотрудники Free Software Foundation написали и поддерживают ряд пакетов программного обеспечения GNU. Два наиболее примечательных из них — библиотека C и оболочка. ... Мы финансировали разработку этих программ, потому что проект GNU был не просто инструментами или средой разработки. Нашей целью была полноценная операционная система, и эти программы были необходимы для этой цели.
  28. ^ stallman.org POSIX
  29. ^ ab POSIX Backgrounder
  30. ^ Mascheck, варианты ясеня
  31. ^ Лен (g...@prep.ai.mit.edu) (20 апреля 1993 г.). «Бюллетень GNU, январь 1993 г.». Группа новостей : gnu.announce. Usenet:  gnusenet930421bulletin@prep.ai.mit.edu. Архивировано из оригинала 2 марта 2021 года . Проверено 28 октября 2010 г.
  32. ^ Ramey, Chet (1 августа 1994 г.). "Bash - оболочка GNU (размышления и извлеченные уроки)". Linux Journal . Архивировано из оригинала 5 декабря 2008 г. Получено 13 ноября 2008 г.
  33. Чет Рэми (31 октября 2010 г.), интервью «Dates in your Computerworld», архивировано из оригинала 20 июля 2012 г. , извлечено 31 октября 2010 г.
  34. ^
    • Гамильтон, Наоми (30 марта 2008 г.). «Языки программирования от А до Я: BASH/Bourne-Again Shell». Computerworld . Архивировано из оригинала 8 ноября 2016 г. . Получено 1 марта 2022 г. .
    • Ramey, Chet (20 апреля 2021 г.). "GNU Bourne-Again Shell". Службы технологической инфраструктуры . Case Western Reserve University . Получено 1 марта 2022 г.
    • Чет Рэми (12 июня 1989 г.). "Исправления и улучшения Bash 0.99". Группа новостей : gnu.bash.bug. Архивировано из оригинала 10 ноября 2012 г. Получено 1 ноября 2010 г.
    • Чет Рэми (24 июля 1989 г.). "Некоторые исправления bash-1.02". Группа новостей : gnu.bash.bug. Архивировано из оригинала 10 ноября 2012 г. Получено 30 октября 2010 г.
    • Брайан Фокс (2 марта 1990 г.). "Доступность bash 1.05". Группа новостей : gnu.bash.bug. Архивировано из оригинала 10 ноября 2012 г. Получено 30 октября 2010 г.
  35. ^ Бреснахан, Кристин; Блюм, Ричард (апрель 2015 г.). CompTIA Linux+ Powered by Linux Professional Institute Study Guide: Exam LX0-103 и Exam LX0-104 (3-е изд.). John Wiley & Sons, Inc. стр. 5. ISBN  978-1-119-02122-3. Архивировано из оригинала 2 марта 2021 г. . Получено 6 июня 2016 г. . В Linux большинство пользователей запускают bash, поскольку это самая популярная оболочка.
  36. ^ Данеш, Арман; Джанг, Майкл (февраль 2006 г.). Мастерство Linux. John Wiley & Sons, Inc. стр. 363. ISBN  978-0-7821-5277-7. Архивировано из оригинала 2 марта 2021 г. . Получено 6 июня 2016 г. . Bourne Again Shell (bash) — наиболее распространённая оболочка, устанавливаемая с дистрибутивами Linux.
  37. ^ ab Переносимый набор символов
  38. ^ abc Debian, Shell
  39. ^ "Альтернатива настольному компьютеру". Forbes .
  40. ^ "Приложение A: Использование командной строки BeOS". testou.free.fr .
  41. ^ ab Единая спецификация UNIX v 3 - Обзор
  42. ^ Bug-bash, самое старое письмо на lists.gnu.org: Re: Режим редактирования строк утерян...
  43. ^ Bug-bash, Bash-2.05 доступен для FTP
  44. ^ Основы администрирования сервера Mac OS S Panther, стр. 189
  45. ^ Фостер-Джонсон, Эрик; Уэлч, Джон К.; Андерсон, Мика (апрель 2005 г.). Beginning Shell Scripting. John Wiley & Sons, Inc. стр. 6. ISBN  978-0-7645-9791-6. Архивировано из оригинала 2 марта 2021 г. . Получено 6 июня 2016 г. . Bash — безусловно, самая популярная оболочка, которая является оболочкой по умолчанию в системах Linux и Mac OSX.
  46. ^ abc POSIX FAQ v 1.18
  47. ^ Bug-bash, Bash-3.0 доступен для FTP
  48. ^ POSIX-2004
  49. ^ Bug-bash, выпущен Bash-3.1
  50. ^ Bug-bash, Bash-3.2 доступен для FTP
  51. ^ Bug-bash, Bash-4.0 доступен для FTP
  52. ^ [2]
  53. ^ «Терминал».
  54. ^ [3]
  55. ^ Bug-bash, Bash-4.1 доступен для FTP
  56. ^ Bug-bash, Bash-4.2 доступен для FTP
  57. ^ "Изменения функций пользовательской среды". Oracle. Архивировано из оригинала 12 июня 2018 г. Получено 8 июня 2018 г.
  58. ^ POSIX-2013
  59. ^ Bug-bash, Bash-4.3 доступен для FTP
  60. ^ Митр, CVE-2014-6271
  61. ^ Bug-bash, Bash 3.0 Официальный патч 1
  62. ^ Windows 10 Insider Preview Сборка 14332
  63. ^
    • "Как установить командную строку оболочки Bash в Windows 10". 28 сентября 2016 г. Архивировано из оригинала 20 ноября 2016 г. Получено 20 ноября 2016 г.
    • "Отсутствует исходный код — соответствие GPL? · Проблема № 107 · Microsoft/WSL". GitHub . Архивировано из оригинала 24 сентября 2019 г. Получено 8 июля 2016 г.
    • "GNU Bash". Softpedia . SoftNews. 23 января 2010 г. Архивировано из оригинала 21 октября 2017 г. Получено 9 апреля 2016 г.
  64. ^ POSIX-2016
  65. ^ "Compatibility Subsystems". Архивировано из оригинала 23 сентября 2020 г. Получено 4 сентября 2020 г.
  66. ^ POSIX-2018
  67. ^ ab scriptingosx.com, Переход на Zsh
  68. ^ "Apple Support - Use zsh as the default shell on your Mac". Архивировано из оригинала 2 декабря 2019 года . Получено 1 июля 2019 года .
  69. ^ Уоррен, Том (4 июня 2019 г.). «Apple replaces bash with zsh as the default shell in macOS Catalina». The Verge . Архивировано из оригинала 10 июня 2019 г. . Получено 13 июня 2019 г. .
  70. ^ Хьюз, Мэтью (4 июня 2019 г.). «Почему macOS Catalina использует Zsh вместо Bash? Лицензирование». The Next Web . Архивировано из оригинала 31 декабря 2020 г. . Получено 12 января 2021 г. .
  71. ^ Доступен релиз Bug-bash, Bash-5.0
  72. ^ Kali Linux 2020.4, zsh по умолчанию
  73. ^ Доступен релиз Bash-5.1
  74. ^ Bug-bash, Bash-5.2 релиз доступен
  75. ^ Github: WSL 2.0.0
  76. ^ Хоффман, Крис (30 июля 2021 г.). «Как установить подсистему Windows для Linux на Windows 11». How-To Geek . Получено 12 октября 2022 г. .
  77. ^ «Среда выполнения команд (справочное руководство Bash)». www.gnu.org .
  78. ^ "Brace Expansion (Bash Reference Manual)". www.gnu.org . Архивировано из оригинала 15 марта 2018 г. Получено 10 января 2024 г.
  79. ^ «Справочное руководство Bash». | веб-сайт = https://www.gnu.org
  80. ^ "Отладка скриптов Bash". tldp.org . Архивировано из оригинала 4 ноября 2018 г. Получено 20 ноября 2018 г.
  81. ^ "The Set Builtin (Bash Reference Manual)". www.gnu.org . Получено 10 января 2024 г. .
  82. ^ "Bash changes [Bash Hackers Wiki (DEV 20200708T2203)]". wiki-dev.bash-hackers.org . Архивировано из оригинала 23 сентября 2019 . Получено 23 сентября 2019 .
  83. ^ "Bourne Shell Builtins (Bash Reference Manual)". www.gnu.org . Получено 10 января 2024 г. .
  84. ^ "Bash Reference Manual". www.gnu.org . Архивировано из оригинала 15 сентября 2019 . Получено 15 сентября 2019 .
  85. ^ "Working more productly with bash 2.x/3.x". www.caliban.org . Архивировано из оригинала 29 июня 2018 г. . Получено 21 июня 2018 г. .
  86. ^ "6.11 Bash POSIX Mode", Справочное руководство GNU Bash, для Bash, версия 4.1, 23 декабря 2009 г., архивировано из оригинала 3 декабря 2010 г. , извлечено 26 октября 2010 г.
  87. ^ "Advanced Bash-Scripting Guide". www.tldp.org . Раздел 37.2 (Bash, версия 3). Архивировано из оригинала 5 мая 2017 г. . Получено 5 марта 2017 г. .
  88. ^ "Bash, версия 4". tldp.org . Архивировано из оригинала 1 июля 2018 г. Получено 25 июня 2018 г.
  89. ^ "Arrays (Bash Reference Manual)". www.gnu.org . Архивировано из оригинала 11 июля 2018 г. Получено 4 июля 2018 г.
  90. ^ "macos - Обновление bash до версии 4.0 на OSX". Ask Different . Архивировано из оригинала 25 июня 2018 г. Получено 25 июня 2018 г.
  91. ^ "Bash Reference Manual". www.gnu.org . Архивировано из оригинала 15 марта 2018 г. Получено 27 марта 2018 г.
  92. ^ ab Mendel Cooper. "Проблемы переносимости". Проект документации Linux . ibiblio.org. Архивировано из оригинала 27 января 2012 г. Получено 26 января 2012 г.
  93. ^ ab "10. Файлы". Debian Policy Manual v4.5.0.2 . Архивировано из оригинала 12 мая 2020 . Получено 11 мая 2020 .
  94. ^ "Как форматировать дату и время в Linux, MacOS и Bash?". Советы по оболочке! . Архивировано из оригинала 3 июня 2020 г. . Получено 3 июня 2020 г. .
  95. ^ ab  –  Руководство по основным командам Linux checkbashisms(1)
  96. ^ ab  –  Руководство по основным командам Linux shellcheck(1)
  97. ^ "Portable Shell". Autoconf . Архивировано из оригинала 2 марта 2021 г. . Получено 20 января 2020 г. .
  98. ^ "Я почти получил редактор и компилятор Linux". Dr. Dobb's . Архивировано из оригинала 2 марта 2021 г. Получено 12 сентября 2020 г. Но практически все скрипты настройки и установки, которые поставляются с программами с открытым исходным кодом, написаны для bash, и если вы хотите понять эти скрипты, вам нужно знать bash.
  99. ^ "архивы bug-bash, Re: Документ, в котором задан параметр -v внутри операторов case, является особенным". 20 апреля 2021 г.
  100. ^ «Справочное руководство по Bash». https://tiswww.case.edu . {{cite web}}: Внешняя ссылка в |website=( помощь )
  101. ^ "Working more productly with bash 2.x/3.x". www.caliban.org . Архивировано из оригинала 29 июня 2018 г. . Получено 21 июня 2018 г. .
  102. ^ "Index of /gnu/bash". ftp.swin.edu.au . Архивировано из оригинала 8 марта 2020 г. Получено 15 сентября 2019 г.
  103. ^ ab "Введение в программируемое завершение". tldp.org . Получено 21 января 2022 г. .
  104. ^ "BASH Help - A Bash Tutorial". Hypexr.org. 5 октября 2012 г. Архивировано из оригинала 2 марта 2021 г. Получено 21 июля 2013 г.
  105. ^ «Спецификации Open Group Base, выпуск 7, издание 2018 г.». pubs.opengroup.org .
  106. ^ "Страница руководства BASH(1)". tiswww.case.edu .
  107. ^ "bash.0\doc - bash.git - bash". git.savannah.gnu.org .
  108. ^ ab "Bash - GNU Project - Free Software Foundation". www.gnu.org . Получено 10 января 2024 г. .
  109. ^
    • «GNU Bourne-Again Shell». tiswww.case.edu .
    • «Часто задаваемые вопросы». tiswww.case.edu .
  110. ^ Руководство GNU Bash, 5.2 Переменные Bash: BASHPID
  111. ^ Руководство GNU Bash, 5.2 Переменные Bash: BASH_ARGC
  112. ^ Руководство GNU Bash, 5.2 Переменные Bash: BASH_ARGV
  113. ^ Руководство GNU Bash, 5.2 Переменные Bash: BASH_LINENO
  114. ^ Руководство GNU Bash, 5.2 Переменные Bash: BASH_REMATCH
  115. ^ Руководство GNU Bash, 5.2 Переменные Bash: BASH_SOURCE
  116. ^ Руководство GNU Bash, 5.2 Переменные Bash: BASH_XTRACEFD
  117. ^ Руководство GNU Bash, 5.2 Переменные Bash: EPOCHREALTIME
  118. ^ Руководство GNU Bash, 5.2 Переменные Bash: FUNCNAME
  119. ^ Руководство GNU Bash, 5.2 Переменные Bash: LINENO
  120. ^ Руководство GNU Bash, 5.2 Переменные Bash: PIPESTATUS
  121. ^ Руководство GNU Bash, 5.2 Переменные Bash: PPID
  122. ^ Руководство GNU Bash, 5.2 Переменные Bash: PS4
  123. ^
    • Руководство GNU Bash, 3.5.3 Расширение параметров оболочки
    • bash(1), Расширение параметров
    • POSIX 2024, 2.6.2 Расширение параметров
  124. ^ Руководство GNU Bash, 3.4.2 Специальные параметры
  125. ^ POSIX 2024, 2.5.2 Специальные параметры
  126. ^ аб
    • Руководство по GNU Bash, 4.3.1 Встроенный Set
    • POSIX 2024, набор
  127. ^ abcde bash(1), ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ
  128. ^ ab Руководство по GNU Bash, 4.1 Встроенные функции Bourne Shell: trap
  129. ^ Руководство GNU Bash, 5.2 Переменные Bash
  130. ^ bash(1): Переменные оболочки
  131. ^ Руководство GNU Bash, 4.3.2 Встроенный Shopt
  132. ^
    • ShellCheck: инструмент анализа скриптов оболочки
    • Github: проверка оболочки
  133. ^ Пакет: devscripts: скрипты, облегчающие жизнь сопровождающему Debian Package
  134. ^ Kcov - покрытие кода
  135. ^ Отладка с помощью отладчика BASH
  136. ^ "[Bashdb-devel] Re: [PATCH] исправление обработки скриптом bashdb каталога tmp"". Документация домашней страницы проекта .
  137. ^ Juliana, Cino (10 июня 2017 г.). "Linux bash exit status and how to set exit status in bash - Techolac". Архивировано из оригинала 21 июня 2019 г. Получено 21 июня 2019 г.
  138. ^ Лейден, Джон (24 сентября 2014 г.). «Patch Bash NOW: ошибка „Shell Shock“ широко распахнула системы OS X и Linux». The Register . Архивировано из оригинала 16 октября 2014 г. Получено 25 сентября 2014 г.
  139. ^ Перлрот, Николь (25 сентября 2014 г.). «Эксперты по безопасности ожидают, что программная ошибка „Shellshock“ в Bash будет значимой». The New York Times . Архивировано из оригинала 5 апреля 2019 г. Получено 25 сентября 2014 г.
  140. ^ Сельцер, Ларри (29 сентября 2014 г.). «Shellshock заставляет Heartbleed выглядеть незначительным». ZDNet . Архивировано из оригинала 14 мая 2016 г.
  141. ^ Хузаифа Сидхпурвала (24 сентября 2014 г.). «Bash special-crafted environment variables code injection attack». Red Hat . Архивировано из оригинала 25 сентября 2014 г. Получено 25 сентября 2014 г.
  142. ^ Шазелас, Стефан (4 октября 2014 г.). "архивы почтовых рассылок oss-sec". Seclists.org . Архивировано из оригинала 6 октября 2014 г. . Получено 4 октября 2014 г. .
  143. ^ bashbug(1) Архивировано 2 октября 2018 г. на Wayback Machine , die.net
  144. ^ "Linux / Unix Command: bashbug" Архивировано 6 октября 2014 г. на Wayback Machine , apple.com
  145. ^ Arch Linux, командная строка оболочки
Retrieved from "https://en.wikipedia.org/w/index.php?title=Bash_(Unix_shell)&oldid=1270269371"