Вышел bash 5.2

от автора

Первая публичная версия bash-5.2 теперь доступна по URL-адресам ниже. Подробности к старту курса по DevOps — под катом.

Bash — это проект GNU Bourne Again SHell, полная реализация спецификации оболочки POSIX с интерактивным редактированием командной строки, контролем задач на архитектурах, где это поддерживается, csh-подобный функционал (подстановка из истории и раскрытие скобок) и многое другое. Подробнее о функционале Bash, новом для этого типа оболочки, смотрите в файле doc/bashref.texi. Есть и большая man-страница, как на Unix, с полным описанием функционала оболочки.

Чтобы сообщать об ошибках в этой версии, воспользуйтесь bashbug. Программа собирается и устанавливается одновременно с bash.

Установка

Для начала прочтите файл README. Инструкции по установке находятся в файле INSTALL.

Новый функционал

Это обновление к пятому большому выпуску bash.

Полное описание нового функционала смотрите в файле NEWS дистрибутива bash-5.2. Ниже приведена копия соответствующих фрагментов.

В этом выпуске устранены баги версии bash-5.1 и добавлен новый функционал.

В числе устранённых — баги, из-за которых работа оболочки завершалась аварийно. Подробности — в файле CHANGES.

Самый заметный новый функционал — переписанный код парсинга подстановки команд, в котором рекурсивно вызывается bison. Это замена синтаксическому анализу прошлых версий, призванная улучшить проверку синтаксиса и отлавливать синтаксические ошибки намного раньше. Синтаксический анализ в оболочке должен стать намного лучше, допускается лишь однократное расширение индексов массива. Это выражается во встроенном unset, в расширениях слов, в условных конструкциях и т. д., в которых как побочный эффект могут присваиваться значения переменных. Встроенной командой unset в ассоциативных массивах отменяется установка ключа со значением индекса @ или *. Отменить её для всего массива можно с помощью unset arrayname.

Появился новый параметр оболочки patsub_replacement. Когда он включён, символ & в строке замены раскрытия подстановки шаблона заменяется частью строки, которая соответствует этому шаблону. Обратным слешем экранируется и вставляется в литерал символ &. Этот параметр включён по умолчанию. В bash добавлены случаи, при которых ветвление запрещено, в том числе в большинстве случаев с $(<file).

Описание всего нового функционала смотрите ниже.

Этот параметр появился и в Readline. В частности, новый параметр enable-active-region, с помощью которого активная область и bracketed-paste контролируются отдельно. Его значение по умолчанию для них одинаково, при активации bracketed-paste активируется и активная область. Теперь пользователи могут её отключить, оставив включённым bracketed-paste. Доступны две новые привязываемые строковые переменные. Их значения — escape-последовательности терминала, одной из которых задаётся цвет для отображения активной области, а другой он отключается. Будучи заданными, они используются вместо режима терминала standout. Наконец, в Readline теперь при каждом вызове проверяется наличие изменений в языковых настройках (`LC_ALL/LC_CTYPE/LANG`), а при изменении локали меняются соответствующее языковое отображение и переменные с привязками ключей.

Имеется несколько изменений, ломающих совместимость bash-5.1 и bash-5.2. Если уровень совместимости с оболочкой не более 50, в here-doc и here-строках используются временные файлы. Работа встроенного в bash-5.2 unset с индексами массива @ и * отличается от прошлых версий и зависит от того, индексный это массив или ассоциативный. B bash-5.2 должно предотвращаться двойное расширение индексов массива, которое происходит в определённых обстоятельствах (особенно при арифметических вычислениях), как если бы был задан параметр оболочки assoc_expand_once. Чтобы вернуться к прежнему поведению, задайте соответствующий уровень совместимости. Подробнее — в файле COMPAT.

При необходимости Bash можно связать с уже установленной библиотекой Readline, а не частной версией в lib/readline. Только в версии readline-8.1 и новее могут указываться все символы, необходимые для bash-5.2; работа прошлых версий библиотеки Readline не будет корректной.

Полный список изменений между bash-5.1 и bash-5.2 слишком большой, чтобы приводить его здесь. Он содержится в файле CHANGES.

Readline

Доступна версия 8.2 автономной библиотеки Readline с собственными скриптами конфигурации и файлами Makefile. Получить её можно по URL-адресам:

Форматированная документация Readline содержится в tar-файле дистрибутива readline. Изменения в Readline описываются отдельно. Как всегда, спасибо за вашу помощь.

Это краткое описание нового функционала bash-5.2. Как всегда, полные описания смотрите на справочной странице (doc/bash.1).

Новый функционал в bash.

  1. В bash при вызове malloc возвращается память, выровненная по 16-байтовым границам.
  2. Чтобы считывать тайм-ауты, используется новый встроенный фреймворк таймера.
  3. Чтобы рекурсивно вызывать парсер и из проанализированной команды выполнять повторную сборку командной строки, переписан код для парсинга подстановки команд. В итоге — улучшается проверка синтаксиса, а ошибки отлавливаются намного раньше. При этом, если после парсинга подстановки команд остаётся считать here-doc, в оболочке выводится сообщение-предупреждение и тело here-doc считывается из текущего входного потока.
  4. Операнд Во встроенном ulimit, который остаётся после анализа всех параметров и аргументов, теперь считается аргументом последней команды, указанной в параметре. Это нужно для совместимости с POSIX.
  5. При считывании тела here-doc выполняется парсинг $'...' и $"...".
  6. Возможна работа привязываемых readline-команд shell-expand-line и history-and-alias-expand-line с '...' и $"...".
  7. Появилась привязываемая readline-команда spell-correct-word для проверки правописания текущего слова.
  8. Во встроенном unset аргументы теперь должны считаться индексами массива без парсинга или увеличения индекса, даже когда не задан assoc_expand_once.
  9. В config-top.h появилось значение по умолчанию для $BASH_LOADABLES_PATH.
  10. Присваивание ассоциативного массива и некоторые случаи ссылок, например с test -v теперь можно использовать @ и * как ключи.
  11. B bash, когда выполняются конструкции оболочки и расширения слов, индексы индексного массива должны раскрываться только один раз.
  12. Во встроенном unset отменяется установка ключа со значением индекса @ или * для ассоциативных массивов. Отменить её для всего массива можно с помощью unset arrayname. В индексных массивах удаляются все их элементы без отмены установки ключа, например A=().
  13. В других встроенных командах (printf/test/read/wait) лучше удаётся не выполнять парсинг индексов массива, если задан array_expand_once.
  14. В числовой аргумент readline-команд задана новая переменная READLINE_ARGUMENT, определяемая с помощью bind -x.
  15. Новый параметр оболочки varredir_close становится причиной автоматического закрытия в bash файловых дескрипторов, открытых с помощью {var}<fn и других стилей varassign-перенаправления, если это не аргументы встроенного exec.
  16. В имени скрипта при запуске любых (неинтерактивных) загрузочных файлов, таких как $BASH_ENV, теперь задаётся специальный параметр $0.
  17. В enable name при попытке включить встроенную команду без каких-либо параметров, которой нет, во встроенном enable должна загружаться (с помощью пути поиска по умолчанию) загружаемая встроенная команда.
  18. Во встроенном printf появился спецификатор формата %Q. Отличается от %q тем, что к исходному аргументу без кавычек применяется любая заданная точность, затем он заключается в кавычки, и выводится результат.
  19. Новым параметром noexpand_translations определяется, заключён ли в одинарные кавычки преобразованный вывод $«…».
  20. Появился оператор преобразования параметров @k. В отличие от @K, после разделения слов результат в нём расширяется до отдельных слов.
  21. Появилась альтернативная реализация массива, выбираемая во время configure (настройки). В ней скорость доступа оптимизируется за счёт бо́льшего расходования памяти (используется новый параметр конфигурации --enable-alt-array-implementation).
  22. Если в перенаправлении [N]<&WORD- или [N]>&WORD- WORD раскрывается в пустую строку, оно будет считаться [N]<&- или [N]>&- и файловый дескриптор N (по умолчанию 0) закроется.
  23. Недопустимые операторы преобразования параметров — это теперь недопустимые расширения слов, поэтому они становятся причиной неустранимых ошибок в неинтерактивных оболочках.
  24. Появился новый параметр оболочки patsub_replacement. Когда он включён, символ & в строке замены раскрытия подстановки шаблона заменяется частью строки, которая соответствует этому шаблону. Символ & экранируется обратным слешем и вставляется литерал.
  25. command -p больше не используется для поиска команд в хеш-таблице.
  26. Чтобы включать в компиляцию или исключать из неё поддержку $«…», появился параметр configure -enable-translatable-strings.
  27. Чтобы при раскрытии имени пути никогда не возвращалось . или . (если нет явно заданного соответствия), появился параметр оболочки globskipdots. Он включён по умолчанию.
  28. Ссылки на массивы с использованием @ и * в качестве значения переменных nameref (declare -n ref='v[@]'; echo $ref) больше не становятся причиной выхода из оболочки, если включён set -u, а установка array (v) отменена.
  29. Появилось новое название привязываемой readline-команды: vi-edit-and-execute-command.
  30. В режиме posix встроенным printf проверяется наличие модификатора длины L. Для спецификаторов преобразования с плавающей точкой используется long double. А если их нет — double.
  31. Появился параметр globstar, который учитывается при автодополнении кода в globbing. ff. С suspend -f теперь работа оболочки приостанавливается, даже если контроль задач отключён. gg. Поскольку нет declare - (эквивалента local -), использование local - в выводе local -p обязательно.

Новый функционал Readline

  1. Номер версии библиотеки истории для использования в приложениях содержится теперь в HS_HISTORY_VERSION.
  2. Дорабатывается множественное раскрытие истории со строками, которые раньше могли быть для этого препятствием (например, abc!$!$).
  3. Появился новый фреймворк для тайм-аутов readline. И с ним новые общедоступные функции для задания тайм-аутов и запрашивания времени до их срабатывания. А ещё функция перехвата, которая может активироваться по истечении времени readline. Для указания тайм-аута теперь имеется новое значение состояния.
  4. Сочетания клавиш с автоматической привязкой к termcap для пролистывания вперёд и назад history-search-backward и history-search-forward соответственно.
  5. Для получения записи по числовому аргументу появилась новая привязываемая команда fetch-history. Отрицательные аргументы отсчитываются с конца истории.
  6. Теперь vi-undo — привязываемая команда.
  7. Появился параметр enable-active-region, с помощью которого активная область и bracketed-paste контролируются отдельно. Его значение по умолчанию для них одинаково, при активации bracketed-paste активируется и активная область. Теперь пользователи могут её отключить, оставив bracketed-paste включённым.
  8. Теперь rl_completer_word_break_characters — это const char *, как rl_basic_word_break_characters.
  9. Readline используется для поиска пользовательского расширения имени файла в $LS_COLORS (*.readline-colored-completion-prefix), которое используется в качестве цвета по умолчанию для отображения общего префикса, когда задан colored-completion-prefix.
  10. Две новые привязываемые строковые переменные active-region-start-color и active-region-end-color. Первая — чтобы задавать цвет для отображения активной области, вторая — для её отключения. Будучи заданными, они используются вместо режима терминала standout.
  11. С новым состоянием readline (RL_STATE_EOF) видимой в приложении переменной (rl_eof_found) в приложениях можно определять, когда в readline происходит считывание до EOF (конца файла) перед вызовом хука deprep-terminal.
  12. Появился новый параметр конфигурации -with-shared-termcap-library, которым принудительно связываются библиотеки общего доступа readline и termcap (или curses/ncurses/termlib), так что в приложениях этого делать не нужно.
  13. В readline теперь при каждом вызове проверяется наличие изменений в языковых настройках (LC_ALL/LC_CTYPE/LANG), а при изменении локали меняются соответствующее языковое отображение и переменные с привязками ключей.

Поможем разобраться в bash и не только, чтобы вы прокачали карьеру и стали востребованным IT-специалистом:

Чтобы увидеть все курсы, кликните по баннеру:


ссылка на оригинал статьи https://habr.com/ru/company/skillfactory/blog/690994/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *