9.2. Bash

В Red Hat Enterprise Linux 6 по умолчанию используется Bash 4.1. В этой секции рассмотрены особенности совместимости этой версии.
  • Начиная с Bash-4.0, в конструкциях подстановки процессов содержимое фигурных скобок не заменяется, поэтому развернутое содержимое и все подстановки процессов требуется указать отдельно.
  • Начиная с Bash-4.0, SIGCHLD может прерывать процесс wait в соответствии со спецификацией Posix, поэтому ловушка SIGCHLD не будет вызываться для каждого завершающего работу процесса при использовании wait для ожидания завершения всех дочерних процессов.
  • Начиная с Bash-4.0, поиск завершающего разделителя подстановки команды $() производится в соответствии с правилами Posix, поэтому ошибки разбора будут обнаружены до создания подоболочки с целью проверки подстановки.
  • При разбиении строки на слова программируемый код завершения использует тот же набор разделителей что и библиотека readline (вместо набора метасимволов оболочки).
  • По истечении ожидания встроенной команды read будет выполнена попытка присвоения прочитанных значений заданным переменным. Если введенно недостаточно значений, переменным будет присвоена пустая строка. Раньше подобный ввод просто игнорировался.
  • Начиная с Bash-4.0, при остановке команды с помощью kill в процессе выполнения последовательности команд оболочка воспринимает это как прерывание.
  • Начиная с Bash-4.0, изменился метод обработки команды set -e: в случае ошибки при выполнении последовательности команд оболочка будет закрыта. Соответствующий стандарт Posix находится в стадии разработки.
  • Начиная с Bash-4.0, исправлена ошибка режима Posix, которая заставляла команду . (source) выполнять поиск имени файла в текущем каталоге, даже если PATH не содержал ".". Согласно правилам Posix, в этой ситуации оболочка не должна проверять переменную PWD.
  • Bash-4.1 использует текущие языковые настройки для сравнения строк в выражениях [[. Это поведение можно изменить с помощью параметров compatNN shopt.
Регулярные выражения

Заключение в кавычки аргумента шаблона в регулярном выражении, сопоставляемому оператору «=~», может нарушить работу выражения. Это актуально для всех архитектур. В ранних версиях bash (до 3.2) результат заключения аргумента в кавычки для передачи выражению «[[ команда =~» явно не оговаривался, но в действительности это требовало добавления обратной наклонной черты для выделения специальных символов, что препятствовало обработке наклонной черты при разборе слов с двойными кавычками и расходилось с результатами аналогичной обработки оператором ==.

Начиная с bash 3.2, заключение символов в кавычки выполняется при внутренней обработке аргументов, передаваемых оператору «=~». Это аннулирует специальное назначение символов, используемых для обработки регулярных выражений («.», «[», «\», «(», «)», «*», «+», «?», «{», «|», «^» и «$») и приводит к их прямой подстановке. Обработка кавычек в выражениях «==» выполняется аналогично.
Эти изменения привели к появлению нескольких проблем, главными из которых являются разные подходы к обработке строк в кавычках у bash 3.1 и bash 3.2, а также наличие пробелов в аргументах шаблонов. Обе проблемы могут быть решены посредством сохранения шаблона в переменную оболочки. При обработке таких переменных строки не разбиваются на слова, поэтому шаблоны могут быть беспрепятственно заключены в кавычки и при замене преобразованы в строку, которая может содержать пробелы. Проблема пробелов может быть решена путем добавления обратной наклонной черты.
Bash 4.0 представляет концепцию уровней совместимости, для управления которыми используется shopt. Так, параметр compat31 позволяет вернуться к правилам обработки аргументов оператора «=~», принятым в bash 3.1.