Spec-Zone.ru › Bash

Режим совместимости оболочки

​ ​

В Bash-4.0 было введено понятие уровня совместимости оболочки, задаваемого набором параметров встроенной команды shopt (compat31, compat32, compat40, compat41 и так далее). В каждый момент времени действует только один уровень совместимости — параметры взаимоисключающие. Уровень совместимости позволяет пользователям выбирать поведение предыдущих версий, несовместимое с поведением новых версий, пока они переносят сценарии на использование текущих возможностей и поведения. Это временное решение.

В этом разделе не рассматривается поведение, являющееся стандартным для определённой версии (например, установка compat32 означает, что заключение в кавычки правой части оператора сопоставления с регулярным выражением экранирует специальные символы регулярного выражения в слове; такое поведение используется по умолчанию в bash-3.2 и более поздних версиях).

Если пользователь включает, скажем, compat32, это может повлиять на поведение других уровней совместимости вплоть до текущего включительно. Идея состоит в том, что каждый уровень совместимости управляет поведением, изменившимся в соответствующей версии Bash, но это поведение могло присутствовать и в более ранних версиях. Например, переход к сравнению с учётом локали в команде [[ произошёл в bash-4.1, а в более ранних версиях использовалось сравнение на основе ASCII, поэтому включение compat32 также активирует сравнение на основе ASCII. Такой точности может быть недостаточно для некоторых задач, поэтому пользователям следует осторожно применять уровни совместимости. Чтобы узнать о текущем поведении, обратитесь к документации по конкретной функции.

В Bash-4.3 появилась новая переменная оболочки: BASH_COMPAT. Значение, присвоенное этой переменной (десятичный номер версии, например 4.2, или целое число, соответствующее параметру compatNN, например 42), определяет уровень совместимости.

Начиная с bash-4.4, Bash начал отказываться от поддержки старых уровней совместимости. В конечном счёте эти параметры будут удалены и заменены на BASH_COMPAT.

Bash-5.0 стала последней версией, в которой для предыдущей версии существовал отдельный параметр shopt. В версиях новее bash-5.0 управлять уровнем совместимости можно только с помощью BASH_COMPAT.

В следующей таблице описаны изменения поведения, контролируемые каждым значением уровня совместимости. Обозначение compatNN используется как сокращённая запись для установки уровня совместимости в NN одним из следующих способов. В версиях до bash-5.0 уровень совместимости можно установить с помощью соответствующего параметра shopt compatNN. Для bash-4.3 и более поздних версий предпочтительно использовать переменную BASH_COMPAT; для bash-5.1 и более поздних версий она обязательна.

compat31
  • Заключение в кавычки правой части оператора сопоставления с регулярным выражением (=~) команды [[ не оказывает особого эффекта
compat40
  • Операторы ‘<’ и ‘>’ команды [[ не учитывают текущую локаль при сравнении строк; они используют порядок ASCII. В версиях Bash до bash-4.1 применяются сортировка ASCII и strcmp(3); в bash-4.1 и более поздних версиях используются последовательность сортировки текущей локали и strcoll(3).
compat41
  • В режиме POSIX после time могут указываться параметры, при этом команда всё равно распознаётся как зарезервированное слово (это толкование 267 стандарта POSIX).
  • В режиме POSIX анализатор требует, чтобы в части word заключённого в двойные кавычки раскрытия параметра ${…} находилось чётное количество одинарных кавычек, и обрабатывает их особым образом, считая символы внутри одинарных кавычек заключёнными в кавычки (это толкование 221 стандарта POSIX).
compat42
  • Строка замены при подстановке по шаблону в двойных кавычках не подвергается удалению кавычек, в отличие от версий после bash-4.2.
  • В режиме POSIX одинарные кавычки считаются специальными при раскрытии части word заключённого в двойные кавычки раскрытия параметра ${…} и могут использоваться для экранирования закрывающей фигурной скобки или другого специального символа (это часть толкования 221 стандарта POSIX); в более поздних версиях одинарные кавычки не являются специальными внутри раскрытия слова в двойных кавычках.
compat43
  • Ошибки раскрытия слов считаются некритическими и приводят к сбою текущей команды даже в режиме POSIX (по умолчанию они считаются критическими и приводят к выходу из оболочки).
  • При выполнении функции оболочки состояние цикла (while/until/и т. д.) не сбрасывается, поэтому break или continue в этой функции прервёт или продолжит циклы в вызывающем контексте. В Bash-4.4 и более поздних версиях состояние цикла сбрасывается, чтобы предотвратить это.
compat44
  • Оболочка задаёт значения, используемые командами BASH_ARGV и BASH_ARGC, так, чтобы они могли раскрыться в позиционные параметры оболочки, даже если расширенный режим отладки не включён.
  • Подоболочка наследует циклы родительского контекста, поэтому break или continue приведёт к выходу из подоболочки. В Bash-5.0 и более поздних версиях состояние цикла сбрасывается, чтобы предотвратить выход.
  • Присваивания переменным перед встроенными командами, такими как export и readonly, которые устанавливают атрибуты, продолжают влиять на переменные с теми же именами в вызывающей среде, даже если оболочка не работает в режиме POSIX.
compat50 (set using BASH_COMPAT)
  • В Bash-5.1 изменён способ генерации $RANDOM, чтобы добавить немного больше случайности. Если уровень совместимости оболочки установлен в 50 или ниже, используется прежний метод из bash-5.0 и более ранних версий, поэтому задание начального значения генератора случайных чисел посредством присваивания значения RANDOM приведёт к той же последовательности, что и в bash-5.0.
  • Если таблица хеширования команд пуста, версии Bash до bash-5.1 выводили соответствующее информационное сообщение даже при выводе данных, которые можно использовать повторно в качестве входных. Bash-5.1 подавляет это сообщение, если указан параметр -l.
compat51 (set using BASH_COMPAT)
  • Встроенная команда unset отменяет объявление массива a при передаче аргумента вида ‘a[@]’. Bash-5.2 отменяет объявление элемента с ключом ‘@’ (ассоциативные массивы) или удаляет все элементы, не отменяя объявление массива (индексированные массивы).
  • Арифметические команды ( ((…)) ) и выражения в арифметическом операторе for могут раскрываться более одного раза.
  • Выражения, используемые в качестве аргументов арифметических операторов условной команды [[, могут раскрываться более одного раза.
  • Выражения в фигурном раскрытии параметра с подстрокой могут раскрываться более одного раза.
  • Выражения в раскрытии слова $(( … )) могут раскрываться более одного раза.
  • Арифметические выражения, используемые в качестве индексов индексированных массивов, могут раскрываться более одного раза.
  • test -v при передаче аргумента ‘A[@]’, где A — существующий ассоциативный массив, возвращает истину, если в массиве есть хотя бы один установленный элемент. Bash-5.2 будет искать ключ ‘@’ и сообщать о нём.
  • Раскрытие слова ${parameter[:]=value} возвращает value до применения преобразований, специфичных для переменной (например, преобразования в нижний регистр). Bash-5.2 возвращает окончательное значение, присвоенное переменной.
  • Разбор подстановок команд выполняется так, как если бы было включено расширенное сопоставление с шаблонами (см. Встроенная команда Shopt), поэтому разбор подстановки команды, содержащей шаблон extglob (например, в составе функции оболочки), не завершится ошибкой. Предполагается, что extglob будет включён до выполнения команды и раскрытия слов. Если к моменту выполнения команды extglob не включён, на этапе раскрытия слов произойдёт ошибка.
compat52 (set using BASH_COMPAT)
  • Встроенная команда test использует свой исторический алгоритм разбора выражений в скобках, если ей передано пять или более аргументов.
  • Если встроенной команде bind передан параметр -p или -P, bind считает все аргументы, оставшиеся после обработки параметров, именами команд, для которых можно задать привязки, и отображает последовательности клавиш, привязанные к этим командам, вместо того чтобы считать аргументы последовательностями клавиш для привязки.
  • Интерактивные оболочки сообщают пользователю о завершённых заданиях во время подключения сценария. В более новых версиях уведомление откладывается до завершения выполнения сценария.

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/Shell-Compatibility-Mode.html

Spec-Zone.ru

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