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_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)
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.
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

Spec-Zone.ru

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