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 имеет редактирование командной строки (см. Редактирование командной строки) и встроенную команду 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 в качестве значения по умолчанию, если не указаны никакие аргументы, кроме опций. Встроенная команда Bash read также принимает строку подсказки с опцией -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.

  • Отличия в реализации от оболочки SVR4.2

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

Spec-Zone.ru

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