Релиз командного интерпретатора 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;
- Встроенная реализация malloc переведена на использование mmap для обеспечения запроса блоков, размером больше 128 Кб, и возможности возврата страниц памяти ядру после выполнения mfree;
- В качестве индексов ассоциативных массивов теперь могут использоваться строки, состоящие только из символов пробела;
- В разряд видимых переведены ранее недокументированные опции localvar_unset и progcomp_alias;
- Переменная "$_" теперь не меняет свое значение, когда shell запускает команду, выполняющую fork.