Режим совместимости оболочки
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_COMPAT в bash-5.0 и более поздних версиях.
В следующей таблице описаны изменения поведения, контролируемые каждой настройкой уровня совместимости. Тег compatNN используется в сокращённой форме для установки уровня совместимости на NN с помощью одного из следующих механизмов. Для версий до bash-5.0 уровень совместимости может быть установлен с помощью соответствующей опции shopt compatNN. Для bash-4.3 и более поздних версий переменная BASH_COMPAT предпочтительнее, и она требуется для bash-5.1 и более поздних версий.
compat31-
- цитирование правой части оператора сопоставления с регулярными выражениями (=~) команды
[[не оказывает специального влияния
- цитирование правой части оператора сопоставления с регулярными выражениями (=~) команды
compat32-
- прерывание списка команд, такого как "a ; b ; c", приводит к выполнению следующей команды в списке (в bash-4.0 и более поздних версиях оболочка действует так, как если бы она получила прерывание, поэтому прерывание одной команды в списке прерывает выполнение всего списка)
compat40-
- операторы ‘<’ и ‘>’ команды
[[не учитывают текущую локаль при сравнении строк; они используют упорядочение ASCII. Версии Bash до bash-4.1 используют сортировку ASCII и strcmp(3); bash-4.1 и более поздние версии используют текущую последовательность сортировки локали и strcoll(3).
- операторы ‘<’ и ‘>’ команды
compat41-
- в режиме posix,
timeможет быть дополнено опциями и по-прежнему распознаваться как зарезервированное слово (это интерпретация POSIX 267) - в режиме posix, анализатор требует, чтобы в части word параметра подстановки с двойными кавычками ${…} находилось чётное количество одинарных кавычек и обращается с ними специальным образом, поэтому символы внутри одинарных кавычек считаются цитированными (это интерпретация POSIX 221)
- в режиме posix,
compat42-
- строка замены в подстановке шаблона с двойными кавычками не подвергается удалению кавычек, как это происходит в версиях после bash-4.2
- в режиме posix одинарные кавычки считаются специальными при расширении части word параметра подстановки с двойными кавычками ${…} и могут быть использованы для цитирования закрывающей фигурной скобки или другого специального символа (это часть интерпретации POSIX 221); в более поздних версиях одинарные кавычки не являются специальными в расширениях слов с двойными кавычками
compat43-
- оболочка не выводит сообщение об ошибке, если предпринята попытка использовать цитированное составное присваивание в качестве аргумента к declare (например, declare -a foo=’(1 2)’). Более поздние версии предупреждают, что такое использование устарело
- ошибки расширения слов считаются не смертельными ошибками, которые приводят к отказу текущей команды, даже в режиме 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 — существующий ассоциативный массив, возвращает true, если массив имеет какие-либо установленные элементы. Bash-5.2 будет искать и сообщать о ключе под названием ‘@’ - расширение слова ${parameter[:]=value} вернёт value до выполнения каких-либо преобразований, специфичных для переменной (например, преобразование в нижний регистр). Bash-5.2 вернёт окончательное присвоенное значение переменной.
- Анализ подстановок команд будет вести себя так, как если бы расширенные маски (см. Встроенная команда Shopt) были включены, так что анализ подстановки команды, содержащей шаблон extglob (например, в качестве части функции оболочки), не завершится ошибкой. Это предполагает, что цель заключается в включении extglob перед выполнением команды и выполнением расширений слов. Он завершится ошибкой на этапе расширения слов, если extglob не будет включён к моменту выполнения команды.
- Встроенная команда
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