Spec-Zone.ru › Bash

Приложение 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.

  • Различия в реализации по сравнению с оболочкой SVR4.2

B.1 Различия в реализации по сравнению с оболочкой SVR4.2

Поскольку Bash — это совершенно новая реализация, многие ограничения оболочки SVR4.2 её не затрагивают. Например:

  • При перенаправлении ввода или вывода в конструкции управления оболочки, такой как оператор if или while, Bash не создаёт дочерний процесс оболочки.
  • Bash не допускает несбалансированные кавычки. При определённых обстоятельствах оболочка SVR4.2 молча вставляет недостающую закрывающую кавычку в EOF. Это может приводить к ошибкам, которые трудно обнаружить.
  • Оболочка SVR4.2 использует сложную схему управления памятью, основанную на перехвате SIGSEGV. Если оболочка запускается из процесса, в котором SIGSEGV заблокирован (например, с помощью вызова функции библиотеки C system()), она работает крайне некорректно.
  • В сомнительной попытке повысить безопасность оболочка 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API