Приложение B. Основные отличия от оболочки Bourne
Bash реализует по существу ту же грамматику, раскрытие параметров и переменных, перенаправление и заключение в кавычки, что и оболочка Bourne. В качестве спецификации реализации и поведения этих возможностей Bash использует стандарт POSIX. Между традиционной оболочкой Bourne и Bash есть некоторые различия; в этом разделе кратко описаны наиболее существенные из них. Многие из этих различий подробнее объясняются в предыдущих разделах. В качестве базового эталона в этом разделе используется версия sh, включённая в SVR4.2 (последняя версия исторической оболочки Bourne).
- Bash соответствует стандарту POSIX, даже если спецификация POSIX отличается от традиционного поведения
sh(см. Bash и POSIX). - Bash поддерживает многосимвольные параметры вызова (см. Вызов Bash).
- Ограниченный режим Bash полезнее (см. Ограниченная оболочка); ограниченный режим оболочки SVR4.2 слишком ограничен.
- В Bash есть редактирование командной строки (см. Редактирование командной строки) и встроенная команда
bind. - Bash предоставляет механизм программируемого завершения слов (см. Программируемое завершение) и встроенные команды
complete,compgenиcompoptдля управления им. - Bash декодирует несколько последовательностей экранирования обратной косой чертой в переменных строк приглашения (
PS0,PS1,PS2иPS4) (см. Управление приглашением). - Bash раскрывает и отображает переменную строки приглашения
PS0. - Перед выводом каждого основного приглашения Bash выполняет команды из массивной переменной
PROMPT_COMMAND. - В Bash есть история команд (см. Возможности истории Bash) и встроенные команды
historyиfcдля управления ею. Список истории Bash хранит метки времени и использует значение переменнойHISTTIMEFORMATдля их отображения. - Bash реализует раскрытие истории, подобное
csh(см. Раскрытие истории). - Bash поддерживает синтаксис заключения в кавычки
$'…', который раскрывает экранированные обратной косой чертой символы ANSI-C в тексте между одинарными кавычками (см. Заключение в кавычки ANSI-C). - Bash поддерживает синтаксис заключения в кавычки
$"…"и выполняет локалезависимый перевод символов между двойными кавычками. Параметры вызова -D, --dump-strings и --dump-po-strings выводят список переводимых строк, найденных в скрипте (см. Локалезависимый перевод). - Bash поддерживает раскрытие фигурных скобок (см. Раскрытие фигурных скобок) и раскрытие тильды (см. Раскрытие тильды).
- Bash реализует псевдонимы команд и встроенные команды
aliasиunalias(см. Псевдонимы). - Bash реализует зарезервированное слово
!для инвертирования возвращаемого значения конвейера (см. Конвейеры). Это очень полезно, когда операторifдолжен выполняться только в случае неудачного завершения проверки. Параметр Bash «-o pipefail» дляsetприводит к тому, что конвейер возвращает код ошибки, если завершается с ошибкой любая команда (см. Встроенная команда Set). - В Bash есть зарезервированное слово
timeи возможность измерения времени выполнения команд (см. Конвейеры). Отображение статистики времени можно управлять с помощью переменнойTIMEFORMAT. - Bash поддерживает сопроцессы и зарезервированное слово
coproc(см. Сопроцессы). - Bash реализует арифметический цикл
for (( expr1 ; expr2 ; expr3 )), аналогичный циклу в языке C (см. Циклические конструкции). - Bash поддерживает составную команду
select, которая позволяет создавать простые меню (см. Условные конструкции). - Bash поддерживает составную команду
[[, которая включает условные проверки в грамматику оболочки (см. Условные конструкции), в том числе необязательное сопоставление с регулярными выражениями. - Bash поддерживает необязательное сопоставление без учёта регистра для конструкций
caseи[[(см. Условные конструкции). - Bash поддерживает дополнительные завершающие разделители списка действий оператора
case: «;&» и «;;&» (см. Условные конструкции). - Bash поддерживает арифметические выражения оболочки, составную команду
(((см. Условные конструкции), встроенную командуletи арифметическое раскрытие (см. Арифметические выражения оболочки). - В Bash есть одномерные массивы-переменные (см. Массивы), а также соответствующие способы раскрытия переменных и синтаксис присваивания для работы с ними. Некоторые встроенные команды Bash принимают параметры для работы с массивами. Bash предоставляет ряд встроенных массивов-переменных.
- Переменные, присутствующие в исходном окружении оболочки, автоматически экспортируются в дочерние процессы (см. Среда выполнения команд). Обычно оболочка Bourne этого не делает, если только переменные не помечены явно с помощью команды
export. - Bash может раскрывать позиционные параметры за пределами
$9с помощью${num}(см. Раскрытие параметров оболочки). - Bash поддерживает оператор присваивания «+=», который добавляет значение к значению переменной, указанной слева (см. Параметры оболочки).
- Bash поддерживает предусмотренные стандартом POSIX раскрытия для удаления шаблонов «%», «#», «%%» и «##», которые удаляют начальные или конечные подстроки из значений переменных (см. Раскрытие параметров оболочки).
- Поддерживается раскрытие
${#xx}, возвращающее длину${xx}(см. Раскрытие параметров оболочки). - Поддерживается раскрытие
${var:offset[:length]}, которое возвращает подстроку значенияvarдлиной length, начинающуюся с позиции offset (см. Раскрытие параметров оболочки). - Доступно раскрытие
${var/[/]pattern[/replacement]}, которое сопоставляет pattern и заменяет его на replacement в значении var (см. Раскрытие параметров оболочки); предусмотрен механизм использования совпавшего текста в replacement. - Доступно раскрытие
${!prefix*}, возвращающее имена всех переменных оболочки, имена которых начинаются с prefix (см. Раскрытие параметров оболочки). - Bash поддерживает косвенное раскрытие переменных с помощью
${!word}(см. Раскрытие параметров оболочки) и реализует атрибут переменнойnamerefдля автоматического косвенного раскрытия переменных. - Bash поддерживает набор раскрытий слов для преобразования параметров вида
${var@X}, где «X» задаёт преобразование (см. Раскрытие параметров оболочки). - Реализована предусмотренная стандартом POSIX форма подстановки команды
$()(см. Подстановка команды); она предпочтительнее``из оболочки Bourne (которое также реализовано для обратной совместимости). - Bash реализует вариант подстановки команды, при котором заключённая в неё команда выполняется в текущем окружении выполнения оболочки:
${ command;}или${|command;}(см. Подстановка команды). - Bash поддерживает подстановку процесса (см. Подстановка процесса).
- Bash автоматически задаёт переменные, содержащие информацию о текущем пользователе (
UID,EUIDиGROUPS), текущем узле (HOSTTYPE,OSTYPE,MACHTYPEиHOSTNAME) и выполняемом экземпляре Bash (BASH,BASH_VERSIONиBASH_VERSINFO). Подробности см. в разделе Переменные Bash. - Bash использует множество переменных для предоставления возможностей и настройки поведения оболочки, которых нет в оболочке Bourne. Например:
RANDOM,SRANDOM,EPOCHSECONDS,EPOCHREALTIME,TIMEFORMAT,BASHPID,BASH_XTRACEFD,GLOBIGNORE,HISTIGNOREиBASH_VERSION. Полный список см. в разделе Переменные Bash. - Bash использует переменную оболочки
GLOBSORTдля управления сортировкой результатов раскрытия имён файлов (см. Раскрытие имён файлов). - Bash использует переменную
IFS, чтобы разбивать на слова только результаты раскрытия, а не все слова (см. Разбиение на слова). Это устраняет давно существовавшую уязвимость оболочки. - В выражениях со скобками для раскрытия имён файлов для отрицания набора символов между скобками используется «!» и «^» (см. Раскрытие имён файлов). Оболочка Bourne использует только «!».
- Bash реализует полный набор операторов раскрытия имён файлов стандарта POSIX, включая классы символов, классы эквивалентности и сортировочные символы (см. Раскрытие имён файлов).
- Bash реализует расширенные возможности сопоставления с шаблонами, если включён параметр оболочки
extglob(см. Сопоставление с шаблонами). - Параметр оболочки
globstarрасширяет раскрытие имён файлов: для поиска совпадающих имён файлов рекурсивно просматриваются каталоги и подкаталоги (см. Сопоставление с шаблонами). - Переменная и функция могут иметь одинаковое имя;
shне разделяет эти два пространства имён. - Функции Bash могут иметь локальные переменные, объявляемые с помощью встроенной команды
local, что позволяет пользователям писать полезные рекурсивные функции (см. Встроенные команды Bash). - Bash выполняет раскрытие имён файлов для имён файлов, указанных в качестве операндов операторов перенаправления ввода и вывода (см. Перенаправления).
- В Bash есть оператор перенаправления «<>», позволяющий открыть файл для чтения и записи, и оператор «&>», направляющий стандартный вывод и стандартный поток ошибок в один файл (см. Перенаправления).
- Bash поддерживает оператор перенаправления «<<<», позволяющий использовать строку в качестве стандартного ввода команды (см. Перенаправления).
- Bash реализует операторы перенаправления «[n]<&word» и «[n]>&word», которые перемещают один файловый дескриптор на другой.
- Bash особым образом обрабатывает некоторые имена файлов, если они используются в операторах перенаправления (см. Перенаправления).
- Bash поддерживает возможность {var}<word, позволяющую оболочке выделять файловые дескрипторы для перенаправлений и присваивать их переменной var (см. Перенаправления). Это работает с несколькими операторами перенаправления.
- Bash может открывать сетевые соединения с произвольными компьютерами и службами с помощью операторов перенаправления (см. Перенаправления).
- Параметр
noclobberпозволяет избежать перезаписи существующих файлов при перенаправлении вывода (см. Встроенная команда Set). Для отмены действияnoclobberможно использовать оператор перенаправления «>|». - Присваивания переменных перед командами влияют только на эту команду, в том числе на встроенные команды и функции (см. Окружение). В
shвсе присваивания переменных перед командами являются глобальными, если только команда не выполняется из файловой системы. - Bash включает ряд возможностей для поддержки отдельного отладчика скриптов оболочки: переменные (
BASH_ARGC,BASH_ARGV,BASH_LINENO,BASH_SOURCE), ловушкиDEBUG,RETURNиERR, «declare -F» и встроенную командуcaller. - Bash реализует стек каталогов, подобный
csh, и предоставляет встроенные командыpushd,popdиdirsдля управления им (см. Стек каталогов). Кроме того, Bash предоставляет доступ к стеку каталогов через значение переменной оболочкиDIRSTACK. - Bash позволяет функции переопределять встроенную команду с тем же именем и предоставляет доступ к функциональности этой встроенной команды внутри функции с помощью встроенных команд
builtinиcommand(см. Встроенные команды Bash). - В Bash есть встроенная команда
caller(см. Встроенные команды Bash), которая отображает контекст любого активного вызова подпрограммы (функции оболочки или скрипта, выполненного с помощью встроенной команды.илиsource). Это позволяет использовать отладчик Bash. - Встроенные команды Bash
cdиpwd(см. Встроенные команды оболочки Bourne) принимают параметры -L и -P для переключения между логическим и физическим режимами. - Встроенная команда
commandпозволяет выборочно пропускать функции оболочки при поиске команд (см. Встроенные команды Bash). - Bash использует встроенную команду
declareдля изменения полного набора атрибутов переменных и функций, а также для присваивания значений переменным. - Встроенная команда
disownможет удалить задание из внутренней таблицы заданий оболочки (см. Встроенные команды управления заданиями) или запретить отправкуSIGHUPзаданию при завершении оболочки вследствиеSIGHUP. - Встроенная команда
enable(см. Встроенные команды Bash) позволяет включать и отключать отдельные встроенные команды, а также поддерживает динамическую загрузку встроенных команд из общих объектов. - Встроенная команда Bash
execпринимает дополнительные параметры, которые позволяют управлять содержимым окружения, передаваемого выполняемой команде, а также значением нулевого аргумента команды (см. Встроенные команды оболочки Bourne). - Функции оболочки можно экспортировать дочерним процессам через окружение с помощью
export -f(см. Функции оболочки). - Встроенные команды Bash
exportиreadonly(см. Встроенные команды оболочки Bourne) принимают параметр -f для работы с функциями оболочки, параметр -p для отображения переменных с различными заданными атрибутами в формате, пригодном для передачи оболочке в качестве ввода, параметр -n для удаления различных атрибутов переменных, а также аргументы «name=value» для одновременного задания атрибутов и значений переменных. - Встроенная команда Bash
hashпозволяет связать имя с произвольным именем файла, даже если этот файл не удаётся найти при поиске в$PATH, с помощью «hash -p» (см. Встроенные команды оболочки Bourne). - В Bash есть встроенная команда
helpдля быстрого просмотра справки по возможностям оболочки (см. Встроенные команды Bash). - В Bash есть встроенная команда
mapfileдля быстрого чтения содержимого файла в индексированный массив-переменную (см. Встроенные команды Bash). - Для отображения форматированного вывода доступна встроенная команда
printf(см. Встроенные команды Bash); она поддерживает дополнительные пользовательские спецификаторы формата и параметр для непосредственного присваивания форматированного вывода переменной оболочки. - Встроенная команда Bash
read(см. Встроенные команды Bash) с параметром -r считывает строку, заканчивающуюся символом «\», и использует переменнуюREPLYпо умолчанию, если не указаны аргументы, не являющиеся параметрами. - Встроенная команда
read(см. Встроенные команды Bash) принимает строку приглашения с параметром -p и использует Readline для получения строки при наличии параметра -e или -E; параметр -i позволяет вставить текст в строку. Встроенная командаreadтакже имеет дополнительные параметры для управления вводом: параметр -s отключает отображение вводимых символов, параметр -t позволяет прервать ожиданиеreadпо истечении заданного числа секунд, если ввод не поступил, параметр -n позволяет считывать заданное число символов вместо всей строки, а параметр -d — считывать ввод до указанного символа, а не до символа новой строки. - Встроенную команду
returnможно использовать для прерывания выполнения скриптов, запущенных с помощью встроенных команд.илиsource(см. Встроенные команды оболочки Bourne). - В Bash гораздо больше необязательных возможностей, которыми можно управлять с помощью встроенной команды
set(см. Встроенная команда Set). - Параметр -x (xtrace) при трассировке выполнения отображает не только простые команды (см. Встроенная команда Set).
- В Bash есть встроенная команда
shopt, позволяющая точнее управлять необязательными возможностями оболочки (см. Встроенная команда Shopt); эти параметры можно задавать и сбрасывать при вызове оболочки (см. Вызов Bash). - Встроенная команда
test(см. Встроенные команды оболочки Bourne) немного отличается: она реализует алгоритм POSIX, определяющий поведение в зависимости от числа аргументов. - Встроенная команда
trap(см. Встроенные команды оболочки Bourne) принимает спецификацию псдосигналаDEBUG, аналогичнуюEXIT. Команды, заданные в ловушкеDEBUG, выполняются перед каждой простой командой, командойfor, командойcase, командойselect, каждой арифметической командойforи перед выполнением первой команды в функции оболочки. ЛовушкаDEBUGне наследуется функциями оболочки, если только функции не присвоен атрибутtraceили если параметрfunctraceне включён с помощью встроенной командыshopt. Параметр оболочкиextdebugдополнительно влияет на ловушкуDEBUG.Встроенная команда
trap(см. Встроенные команды оболочки Bourne) принимает спецификацию псдосигналаERR, аналогичнуюEXITиDEBUG. Команды, заданные в ловушкеERR, выполняются после неудачного завершения простой команды, за некоторыми исключениями. ЛовушкаERRне наследуется функциями оболочки, если не включён параметр-o errtraceвстроенной командыset.Встроенная команда
trap(см. Встроенные команды оболочки Bourne) принимает спецификацию псдосигналаRETURN, аналогичнуюEXITиDEBUG. Команды, заданные в ловушкеRETURN, выполняются перед возобновлением выполнения после возврата из функции оболочки или скрипта оболочки, запущенного с помощью.илиsource. ЛовушкаRETURNне наследуется функциями оболочки, если только функции не присвоен атрибутtraceили если параметрfunctraceне включён с помощью встроенной командыshopt. - Встроенная команда Bash
typeобладает более широкими возможностями и предоставляет больше сведений о найденных именах (см. Встроенные команды Bash). - Встроенная команда
ulimitпозволяет управлять гораздо большим числом ресурсов отдельных процессов (см. Встроенные команды Bash). - Встроенная команда Bash
umaskиспользует параметр -p для вывода результата в виде командыumask, которую можно повторно использовать как ввод (см. Встроенные команды оболочки Bourne). - У встроенной команды Bash
waitесть параметр -n, позволяющий ожидать завершения следующего дочернего процесса, при необходимости выбрав его из списка заданий, и параметр -p для сохранения сведений о завершившемся дочернем процессе в переменной оболочки. - Оболочка SVR4.2 ведёт себя иначе при вызове как
jsh(включается управление заданиями). - В оболочке SVR4.2 есть две встроенные команды для управления привилегиями (
mldmodeиpriv), отсутствующие в Bash. - В Bash нет встроенных команд
stopиnewgrp. - Bash не использует переменную
SHACCTи не ведёт учёт работы оболочки. - В SVR4.2
shиспользует переменнуюTIMEOUT, подобно тому как Bash используетTMOUT.
Другие возможности, уникальные для Bash, описаны в разделе Возможности Bash.
B.1 Различия в реализации по сравнению с оболочкой SVR4.2
Поскольку Bash — это совершенно новая реализация, многие ограничения оболочки SVR4.2 её не затрагивают. Например:
- При перенаправлении ввода или вывода в конструкции управления оболочки, такой как оператор
ifилиwhile, Bash не создаёт дочерний процесс оболочки. - Bash не допускает несбалансированные кавычки. При определённых обстоятельствах оболочка SVR4.2 молча вставляет недостающую закрывающую кавычку в
EOF. Это может приводить к ошибкам, которые трудно обнаружить. - Оболочка SVR4.2 использует сложную схему управления памятью, основанную на перехвате
SIGSEGV. Если оболочка запускается из процесса, в которомSIGSEGVзаблокирован (например, с помощью вызова функции библиотеки Csystem()), она работает крайне некорректно. - В сомнительной попытке повысить безопасность оболочка SVR4.2 при вызове без параметра -p меняет действительные и эффективные значения UID и GID, если они ниже некоторого магического порогового значения, обычно равного 100. Это может привести к неожиданным результатам.
- Оболочка SVR4.2 не позволяет пользователям устанавливать ловушки для
SIGSEGV,SIGALRMилиSIGCHLD. - Оболочка SVR4.2 не позволяет сбрасывать переменные
IFS,MAILCHECK,PATH,PS1иPS2. - Оболочка SVR4.2 считает «^» недокументированным эквивалентом «|».
- Bash позволяет указывать несколько аргументов-параметров при вызове (
-x -v); оболочка SVR4.2 допускает только один аргумент-параметр (-xv). Более того, некоторые версии оболочки аварийно завершаются, если второй аргумент начинается с «-». - Оболочка SVR4.2 завершает работу скрипта при сбое любой встроенной команды; Bash завершает работу скрипта только при сбое одной из специальных встроенных команд POSIX и только в некоторых случаях, перечисленных в стандарте POSIX.
- Если включён параметр
lastpipe, а управление заданиями не активно, Bash выполняет последний элемент конвейера в текущем окружении выполнения оболочки.
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Major-Differences-From-The-Bourne-Shell.html