Приложение B Основные отличия от оболочки Bourne
Bash реализует по существу ту же грамматику, расширение параметров и переменных, перенаправление и цитирование, что и оболочка Bourne. Bash использует стандарт POSIX в качестве спецификации реализации этих функций. Существуют некоторые различия между традиционной оболочкой Bourne и Bash; этот раздел кратко описывает значимые отличия. Ряд этих различий более подробно описан в предыдущих разделах. В этом разделе используется версия sh, включенная в SVR4.2 (последняя версия исторической оболочки Bourne), в качестве исходной точки отсчёта.
- Bash соответствует спецификации POSIX, даже там, где спецификация POSIX отличается от традиционного
shповедения (см. Режим Bash POSIX). - Bash имеет многосимвольные параметры вызова (см. Вызов Bash).
- Bash имеет редактирование командной строки (см. Редактирование командной строки) и встроенную команду
bind. - Bash предоставляет механизм программируемого дополнения слов (см. Программируемое дополнение), а также встроенные команды
complete,compgen, иcompopt, для его управления. - Bash имеет историю команд (см. История команд Bash) и встроенные команды
historyиfcдля управления ею. Список истории Bash сохраняет информацию о времени и использует значение переменнойHISTTIMEFORMATдля ее отображения. - Bash реализует расширение истории, подобное
csh(см. Расширение истории). - Bash имеет переменные массивов одного измерения (см. Массивы), а также соответствующий синтаксис расширения переменных и присваивания для их использования. Несколько встроенных команд Bash принимают параметры для работы с массивами. Bash предоставляет ряд встроенных переменных массива.
- Поддерживается синтаксис цитирования
$'…', который расширяет символы, экранированные обратной косой чертой ANSI-C, в тексте между одинарными кавычками (см. Цитаты ANSI-C). - Bash поддерживает синтаксис цитирования
$"…", для выполнения локализованного перевода символов между двойными кавычками. Параметры вызова -D, --dump-strings и --dump-po-strings выводят переводимые строки, найденные в скрипте (см. Перевод, специфичный для локали). - Bash реализует ключевое слово
!, чтобы инвертировать возвращаемое значение конвейера (см. Конвейеры). Очень полезно, когда операторifдолжен выполняться только в случае неудачи теста. Опция Bash ‘-o pipefail’ дляsetзаставит конвейер вернуть статус ошибки, если какая-либо команда завершится с ошибкой. - Bash имеет зарезервированное слово
timeи отслеживание времени выполнения команд (см. Конвейеры). Отображение статистических данных о времени может быть настроено с помощью переменнойTIMEFORMAT. - Bash реализует арифметику
for (( expr1 ; expr2 ; expr3 ))для команд, аналогично языку C (см. Циклические конструкции). - Bash включает составную команду
select, которая позволяет генерировать простые меню (см. Условные конструкции). - Bash включает составную команду
[[, которая делает условные тесты частью грамматики оболочки (см. Условные конструкции), включая необязательный поиск по регулярным выражениям. - Bash предоставляет необязательный вариант сопоставления без учета регистра для конструкций
caseи[[. - Bash включает расширение фигурных скобок (см. Расширение фигурных скобок) и расширение тильды (см. Расширение тильды).
- Bash реализует алиасы команд и встроенные команды
aliasиunalias(см. Алиасы). - Bash предоставляет арифметику оболочки, составную команду
(((см. Условные конструкции) и арифметическое расширение (см. Арифметика оболочки). - Переменные, присутствующие в исходной среде оболочки, автоматически экспортируются в дочерние процессы. Оболочка Bourne обычно не делает этого, если переменные не отмечены явно с помощью команды
export. - Bash поддерживает оператор присваивания ‘+=’, который добавляет значение к значению переменной, указанной в левой части.
- Bash включает удаление шаблонов POSIX ‘%’, ‘#’, ‘%%’ и ‘##’ для удаления начальных или конечных подстрок из значений переменных (см. Расширение параметров оболочки).
- Поддерживается расширение
${#xx}, которое возвращает длину${xx}(см. Расширение параметров оболочки). - Наличие расширения
${var:offset[:length]}, которое расширяется до подстроки значенияvarдлиной length, начиная с offset, (см. Расширение параметров оболочки). - Доступно расширение
${var/[/]pattern[/replacement]}, которое ищет pattern и заменяет его на replacement в значении var (см. Расширение параметров оболочки). - Доступно расширение
${!prefix*}расширения, которое расширяется до имен всех переменных оболочки, имена которых начинаются с prefix (см. Расширение параметров оболочки). - Bash имеет косвенное расширение переменных с использованием
${!word}(см. Расширение параметров оболочки). - Bash может расширять позиционные параметры за пределами
$9с помощью${num}. - Реализована форма подстановки команд POSIX
$()(см. Подстановка команд), предпочтительная перед формой оболочки Bourne``(которая также реализована для обратной совместимости). - Bash имеет подстановку процессов (см. Подстановка процессов).
- Bash автоматически присваивает переменные, содержащие информацию об текущем пользователе (
UID,EUID, иGROUPS), текущем хосте (HOSTTYPE,OSTYPE,MACHTYPE, иHOSTNAME), и текущей инстанции Bash (BASH,BASH_VERSION, иBASH_VERSINFO). Подробности см. в Переменные Bash. - Переменная
IFSиспользуется для разделения только результатов расширения, а не всех слов (см. Разделение слов). Это закрывает давнюю брешь в безопасности оболочки. - Код выражения для расширения имен файлов использует ‘!’ и ‘^’ для отрицания набора символов в скобках. Оболочка Bourne использует только ‘!’.
- Bash реализует полный набор операторов расширения имен файлов POSIX, включая классы символов, классы эквивалентности и символы сопоставления (см. Расширение имен файлов).
- Bash реализует расширенные возможности сопоставления по шаблону, когда включен параметр оболочки
extglob(см. Сопоставление по шаблону). - Возможна ситуация, когда переменная и функция имеют одинаковое имя;
shне разделяет эти два пространства имен. - Функции Bash могут иметь локальные переменные с использованием встроенной команды
local, что позволяет создавать полезные рекурсивные функции (см. Встроенные команды Bash). - Присваивания переменных, предшествующие командам, влияют только на эту команду, даже на встроенные команды и функции (см. Окружение). В
sh, все присваивания переменных, предшествующие командам, являются глобальными, если команда не выполняется из файловой системы. - Bash выполняет расширение имен файлов для имен файлов, указанных в качестве операндов операторов перенаправления ввода и вывода (см. Перенаправление).
- Bash содержит оператор перенаправления ‘<>’, позволяющий открыть файл для чтения и записи, и оператор перенаправления ‘&>’, для перенаправления стандартного вывода и стандартной ошибки в один и тот же файл (см. Перенаправление).
- Bash включает оператор перенаправления ‘<<<’, позволяющий использовать строку в качестве стандартного ввода для команды.
- Bash реализует операторы перенаправления ‘[n]<&word’ и ‘[n]>&word’, которые перемещают один дескриптор файла в другой.
- Bash особым образом обрабатывает ряд имен файлов, когда они используются в операторах перенаправления (см. Перенаправление).
- Bash может открывать сетевые соединения с произвольными машинами и сервисами с помощью операторов перенаправления (см. Перенаправление).
- Доступен параметр
noclobberдля предотвращения перезаписи существующих файлов с помощью перенаправления вывода (см. Встроенная команда Set). Оператор перенаправления ‘>|’ может быть использован для отменыnoclobber. - Встроенные команды Bash
cdиpwd(см. Встроенные команды оболочки Bourne) каждая принимает параметры -L и -P для переключения между логическим и физическим режимами. - Bash позволяет функции переопределять встроенную команду с тем же именем и предоставляет доступ к функциональности этой встроенной команды внутри функции через встроенные команды
builtinиcommand(см. Встроенные команды Bash). - Встроенная команда
commandпозволяет выборочно отключать функции при поиске команд (см. Встроенные команды Bash). - Индивидуальные встроенные команды могут быть включены или выключены с помощью встроенной команды
enable(см. Встроенные команды Bash). - Встроенная команда Bash
execпринимает дополнительные параметры, которые позволяют пользователям управлять содержимым среды, передаваемой исполняемой команде, и тем, каким будет нулевой аргумент команды (см. Встроенные команды оболочки Bourne). - Функции оболочки могут быть экспортированы в дочерние процессы через среду с помощью
export -f(см. Функции оболочки). - Встроенные команды Bash
export,readonly, иdeclareмогут принимать параметр -f для обработки функций оболочки, параметр -p для отображения переменных с различными атрибутами, установленных в формате, который можно использовать в качестве входных данных оболочки, параметр -n для удаления различных атрибутов переменных и аргументы ‘name=value’ для одновременной установки атрибутов и значений переменных. - Встроенная команда Bash
hashпозволяет связать имя с произвольным именем файла, даже если этот файл не может быть найден при поиске в$PATH, используя ‘hash -p’ (см. Встроенные команды оболочки Bourne). - Bash включает встроенную команду
helpдля быстрого доступа к возможностям оболочки (см. Встроенные команды Bash). - Доступна встроенная команда
printfдля отображения отформатированного вывода (см. Встроенные команды Bash).
- Встроенная команда Bash
read(см. Команды Bash Builtin) будет читать строку, заканчивающуюся символом ‘\’, с опцией -r, и будет использовать переменнуюREPLYв качестве значения по умолчанию, если не указаны никакие аргументы, кроме опций. Встроенная команда Bashreadтакже принимает строку подсказки с опцией -p и будет использовать Readline для получения строки, если задана опция -e. Встроенная командаreadтакже имеет дополнительные опции для управления вводом: опция -s выключает отображение вводимых символов по мере их ввода, опция -t позволяетreadвыйти с ошибкой по тайм-ауту, если ввод не произойдёт в течение заданного количества секунд, опция -n позволяет считать только указанное количество символов вместо всей строки, а опция -d считывает данные до указанного символа вместо новой строки. - Встроенная команда
returnможет быть использована для прерывания выполнения скриптов, запущенных с помощью встроенных команд.илиsource(см. Встроенные команды Bourne Shell). - Bash включает встроенную команду
shopt, для более тонкого управления дополнительными возможностями оболочки (см. Встроенная команда Shopt), и позволяет устанавливать и сбрасывать эти опции при вызове оболочки (см. Вызов Bash). - Bash имеет гораздо больше дополнительных возможностей, контролируемых встроенной командой
set(см. Встроенная команда Set). - Опция ‘-x’ (xtrace) отображает команды, кроме простых команд, при выполнении отслеживания выполнения (см. Встроенная команда Set).
- Встроенная команда
test(см. Встроенные команды Bourne Shell) немного отличается, так как она реализует алгоритм POSIX, который определяет поведение на основе количества аргументов. - Bash включает встроенную команду
caller, которая отображает контекст любого активного вызова подпрограммы (функции оболочки или скрипта, запущенного с помощью встроенных команд.илиsource). Это поддерживает отладчик Bash. - Встроенная команда
trap(см. Встроенные команды Bourne Shell) позволяет указать псевдосигналDEBUG, аналогичныйEXIT. Команды, указанные с ловушкойDEBUG, выполняются перед каждой простой командой, командойfor, командойcase, командойselect, каждой арифметической командойforи перед выполнением первой команды в функции оболочки. ЛовушкаDEBUGне наследуется функциями оболочки, если функция не была задана атрибутомtraceили опцияfunctraceне была включена с помощью встроенной командыshopt. Опция оболочкиextdebugимеет дополнительные эффекты на ловушкуDEBUG.Встроенная команда
trap(см. Встроенные команды Bourne Shell) позволяет указать псевдосигналERR, аналогичныйEXITиDEBUG. Команды, указанные с ловушкойERR, выполняются после того, как простая команда завершается с ошибкой, за исключением некоторых случаев. ЛовушкаERRне наследуется функциями оболочки, если опция-o errtraceдля встроенной командыsetне включена.Встроенная команда
trap(см. Встроенные команды Bourne Shell) позволяет указать псевдосигналRETURN, аналогичныйEXITиDEBUG. Команды, указанные с ловушкойRETURN, выполняются перед возобновлением выполнения после возвращения функции оболочки или скрипта оболочки, выполненного с помощью.илиsource. ЛовушкаRETURNне наследуется функциями оболочки, если функция не была задана атрибутомtraceили опцияfunctraceне была включена с помощью встроенной командыshopt. - Встроенная команда Bash
typeболее обширная и предоставляет больше информации о найденных именах (см. Команды Bash Builtin). - Встроенная команда Bash
umaskдопускает опцию -p, чтобы вывод отображался в форме командыumask, которая может быть повторно использована в качестве входных данных (см. Встроенные команды Bourne Shell). - Bash реализует стековый механизм каталогов, подобный
csh, и предоставляет встроенные командыpushd,popd, иdirsдля его управления (см. Стек каталогов). Bash также делает стек каталогов видимым как значение переменной оболочкиDIRSTACK. - Bash интерпретирует специальные обрамлённые обратным слэшем символы в строках подсказки при интерактивном режиме (см. Управление подсказкой).
- Режим ограниченной оболочки Bash более полезен (см. Ограниченная оболочка); режим ограниченной оболочки SVR4.2 слишком ограничен.
- Встроенная команда
disownможет удалить задачу из внутренней таблицы задач оболочки (см. Встроенные команды управления задачами) или подавить отправкуSIGHUPзадаче при завершении оболочки в результатеSIGHUP. - Bash включает ряд функций для поддержки отдельного отладчика для скриптов оболочки.
- Оболочка 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. Например:
- Bash не создаёт дочернюю оболочку при перенаправлении данных в или из структуры управления оболочки, такой как инструкция
ifилиwhile. - Bash не допускает несбалансированные кавычки. Оболочка SVR4.2 будет безмолвно вставлять необходимую закрывающую кавычку в
EOFв некоторых ситуациях. Это может быть причиной трудно обнаруживаемых ошибок. - Оболочка SVR4.2 использует сложную схему управления памятью, основанную на перехвате
SIGSEGV. Если оболочка запускается из процесса, в которомSIGSEGVзаблокирована (например, с помощью вызова функции библиотекиsystem()C), она будет работать неправильно. - В сомнительной попытке обеспечения безопасности, оболочка 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.
- Оболочка SVR4.2 ведёт себя по-разному при вызове в качестве
jsh(она включает управление задачами).
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