9.2. Bash

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.