Релиз командного интерпретатора Bash 5.0

После двух с половиной лет разработки опубликована новая версия командного интерпретатора GNU Bash 5.0, используемого по умолчанию в большинстве дистрибутивов Linux. Одновременно состоялся релиз библиотеки readline 8.0, применяемой в bash для организации редактирования командной строки.

Значительное изменение номера версии Bash связано с внесением изменений, нарушающих обратную совместимость. В частности, в новой версии переработан код, связанный с обработкой ссылочных переменных nameref, что привело к отдельным изменениям поведения при использовании nameref (например, цикл разбора имён nameref внутри функций теперь приводит к определению переменных не в локальном, а в глобальном контексте). Кроме того, по умолчанию переменные BASH_ARGC и BASH_ARGV теперь выставляются только при включении расширенного отладочного режима, что позволило избавиться от проблем с производительностью при передаче скриптами большого числа аргументов. Для работы нового выпуска необходимо наличие свежей библиотеки readline, т.е. для установки Bash 5.0 в дистрибутивах с выпусками readline до 8.0 потребуется переустановка readline или встраивание новой версии библиотеки при сборке Bash.

Из улучшений можно отметить:

  • Предложены новые переменные окружения: BASH_ARGV0 (принимает значение $0), EPOCHSECONDS (эпохальное время в секундах) и EPOCHREALTIME (эпохальное время с точностью до микросекунд);
  • Во встроенную команду «history» добавлена поддержка выборочного удаления записей из БД с историей операций («history -d start-end») и возможность указания отрицательных значений в качестве смещения первой удаляемой записи относительно конца списка (например,»-1» указывает на предыдущую команду);
  • Добавлена опция «localvar_inherit», при установке которой локальные переменные наследуют значение переменный с теми же именами, определёнными в вышестоящей области видимости;
  • Добавлена опция «assoc_expand_once», при установке которой оболочка осуществляет раскрытие индексов ассоциативных массивов только один раз;
  • Включена по умолчанию опция «globasciiranges», допускающая использование масок для определения диапазонов символов ([a-z]);
  • Добавлены встроенные реализации команд rm, stat, seq и fdflags;
  • Во встроенной команде «wait» обеспечена возможность ожидания замещения последнего процесса и добавлена опция »-f» для ожидания завершения процесса/работы вместо ожидания изменения состояния;
  • Добавлена возможность жёсткого определения в файле config-top.h значений $PATH и $HISTSIZE. Данные значения будут более приоритетными, чем значения из переменных окружения и могут применяться для создания ограниченных окружений;
  • При автодополнении ввода теперь не учитывается регистр символов для имён функций и псевдонимов (alias), если в readline выставлен режим completion-ignore-case;
  • Во встроенной команде «umask» разрешено использование режимов доступа и масок, превышающих восьмеричное значение 777;
  • Во встроенной команде «times» в зависимости от настройки локали теперь может выводиться не только точка, но и запятая в качестве разделителя дробных значений;
  • Добавлена отключенная по умолчанию и недокументированная опция «syslog_history» для включения отправки в syslog истории ввода команд;
  • Встроенная реализация malloc переведена на использование mmap для обеспечения запроса блоков, размером больше 128 Кб, и возможности возврата страниц памяти ядру после выполнения mfree;
  • В качестве индексов ассоциативных массивов теперь могут использоваться строки, состоящие только из символов пробела;
  • В разряд видимых переведены ранее недокументированные опции localvar_unset и progcomp_alias;
  • Переменная »$_» теперь не меняет своё значение, когда shell запускает команду, выполняющую fork.

© OpenNet