Режим совместимости оболочки
В 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).
- В режиме 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.
- В Bash-5.1 изменён способ генерации
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