odmin@opslog: ~/blog
← cd ..
odmin@opslog:~/blog$ cat coreutils-9-12.md

Выпущен GNU Coreutils 9.12

14 сентября 2026 года вышел GNU Coreutils 9.12 — стабильный выпуск набора базовых утилит. Среди основных изменений — сохранение и восстановление окружения через env, более безопасный вывод в терминал, устойчивый обход каталогов и улучшенная работа sort при чтении из каналов.

За 21 неделю после выпуска 9.11 в проект вошли 288 коммитов от 16 участников.

Новые возможности

  • env поддерживает параметр --env0-from=FILE для чтения записей окружения из файла, разделённых нулевым байтом (NUL). Вместе с -i записи сохраняются в точности, что позволяет полностью восстановить окружение, включая повторяющиеся и нестандартные записи.
  • stat и tail распознают файловые системы failfs и nullfs. Команда stat -f -c%T выводит их тип, а tail -f использует для них inotify.
  • В uname добавлен параметр -A, или --all-labeled: каждый элемент информации выводится на отдельной строке с подписью.

Новый параметр env также позволяет фильтровать окружение. Например, в Bash можно использовать следующую схему, заменив ... выражением для sed:

bash
env -i --env0-from=<( env -0 | sed -z ... )

Исправления ошибок

  • chcon, chgrp, chmod, chown, du и ls при рекурсивном обходе каталогов больше не завершаются с ошибкой только из-за того, что файлы параллельно удаляются.
  • comm - - больше не закрывает стандартный ввод дважды. Раньше это приводило к ошибочному завершению с ненулевым кодом.
  • cp, install и mv переходят к обычному копированию, если клонирование с --reflink=auto завершается ошибкой EDQUOT, ENOMEM или ENOSPC. Например, в XFS клонирование может исчерпать место для метаданных в группе размещения, хотя обычное копирование ещё возможно. Регрессия появилась в версии 9.2.
  • cut -d корректно использует последний указанный разделитель, если задано несколько параметров с многобайтовыми разделителями. Ошибка появилась вместе с их поддержкой в версии 9.11.
  • date больше не переносит флаги вроде _ и - на год в спецификаторе %D, сохраняя согласованное форматирование компонентов даты. Пример затронутой команды: date -d '1-2-3' "+%_D". Ошибка появилась в версии 8.31.
  • du --max-depth=N при отрицательном N выводит сообщение об ошибке и завершается с ненулевым кодом. Раньше такое значение обрабатывалось как ноль. Ошибка появилась в версии 9.4.
  • В factor исправлено чтение за границами буфера (CWE-126) при обработке некоторых значений. Ошибка появилась в версии 9.8.
  • head и tail при необходимости заключают имена файлов в кавычки в заголовках вывода.
  • ls --color больше не обращается к освобождённой памяти, если в LS_COLORS задано ln=target, а дальнейшая часть значения некорректна, например LS_COLORS='ln=target:x'.
  • mv предупреждает об ошибке ENOTSUP при копировании расширенных атрибутов, например при переносе файлов на файловую систему без их поддержки. Ошибка появилась в версии 7.3.
  • numfmt, printf и seq в Solaris больше не добавляют лишнее e+00 при большой точности форматирования, например %.5119f.
  • pinky -l сохраняет правильный порядок вывода при полной буферизации стандартного вывода, например при перенаправлении в файл. Ошибка появилась в версии 9.10.
  • pr корректно завершает работу при превышении внутренних пределов учёта, например при обработке больших позиций табуляции.
  • ptx -G больше не зацикливается, если ширина вывода меньше удвоенного размера промежутка, как в ptx -G -w4, или если слишком мало места остаётся из-за длинной ссылки при ptx -G -r.
  • ptx -W больше не зацикливается, если регулярное выражение для слова допускает пустую строку, как в echo ab | ptx -W 'a*'.
  • shred больше не блокируется при открытии именованного канала (FIFO), у которого нет читателей.
  • stty больше не завершается с ошибкой, когда система использует вариант кодирования запрошенной скорости. Регрессия появилась в версии 9.8.
  • В tee исправлены две регрессии версии 9.11: бесконечный цикл после записи всего вывода, если вызов записи установил errno в EAGAIN, и ошибочная обработка частичной записи как сбоя.
  • test больше не считает -a и -o операторами, когда они переданы как строковые аргументы бинарному оператору. Например, test -a -a -a теперь завершается успешно.
  • truncate --reference=R больше не зависает, если R — FIFO без читателей. Ошибка появилась в версии 8.17.
  • В unexpand -t исправлено переполнение буфера в куче при значениях табуляции больше SIZE_MAX/16 или при многобайтовых пробельных символах, длина которых превышает значение табуляции. Ошибки появились в версии 9.11.
  • В uniq -w исправлен выход за границы буфера чтения в многобайтовых локалях. Ошибка появилась в версии 9.5.
  • wc больше не читает за границами таблицы поиска в старых многобайтовых локалях, например SHIFT-JIS, где один байт может декодироваться в широкий символ. Ошибка появилась в версии 9.5.
  • Исправлены неверные переводы сообщений Gnulib в неанглоязычных локалях. Ошибка появилась в версии 9.6.

Изменения поведения

  • env и printenv теперь экранируют выводимые переменные окружения с учётом QUOTING_STYLE. По умолчанию используется стиль shell-escape. Это предотвращает вывод произвольных данных в терминал и позволяет читать результат как код оболочки POSIX.
  • В ls параметр -w, или --width, больше не учитывает символ перевода строки \n в ширине строки. Указанная ширина или значение COLUMNS теперь задаёт включительный верхний предел.
  • stat при необходимости использует кавычки и экранирование оболочки для имён файлов. Раньше это происходило только с форматом %N. Стиль по умолчанию учитывает QUOTING_STYLE, как и %N. Добавлен формат %Qn для вывода имён с экранированием; %n по-прежнему выводит их без него.

Улучшения производительности и вывода

  • При сборке с --with-wtmpdb команды who /var/log/wtmp и users /var/log/wtmp используют базу wtmpdb вместо файла /var/log/wtmp, что устраняет для них проблему 2038 года.
  • cut -w эффективнее извлекает начало строки в многобайтовых локалях: на типичных входных данных пропускная способность выросла в четыре раза.
  • df, du, ls, od, pr и sort экранируют некорректные аргументы в сообщениях об ошибках для параметров, ожидающих целое число.
  • env -0 и printenv -0 явно включают двоичный режим вывода, предотвращая преобразование переводов строк в CRLF, например в Windows.
  • install -C не обновляет метаданные файла, если у целевого файла уже установлены нужные владелец, группа и права доступа.
  • basename, dirname, du, readlink и realpath используют стиль shell-escape, когда стандартный вывод направлен в терминал. Изменить или отключить экранирование можно через переменную окружения QUOTING_STYLE.
  • ls -m при необходимости заключает имена файлов с запятыми в кавычки, чтобы их было проще отличить от запятых-разделителей.
  • ls заменяет переводы строк в именах файлов, если их можно спутать с разделителями. Раньше такая защита применялась только при выводе в терминал.
  • sort эффективнее использует доступную память и параллельную обработку при чтении данных неизвестного размера, например из каналов.
  • uniq -c работает до 2,5 раза быстрее в системах с функциями стандартного ввода-вывода без блокировок.

Изменения сборки

  • Исправлена сборка logname в окружениях с заменой getlogin(), например musl, при использовании библиотек systemd: теперь подключаются необходимые библиотеки.
  • Размер единого исполняемого файла, собираемого с --enable-single-binary, уменьшен примерно на 10 КБ за счёт более эффективного повторного использования кода test в [ и true в false.
  • Удалён параметр --with-linux-crypto, позволявший cksum, md5sum и sha*sum использовать Linux AF_ALG API. Согласно примечаниям к выпуску, этот API будет объявлен устаревшим в Linux 7.2 и уступает OpenSSL по производительности.
  • Параметр --enable-systemd переименован в --with-systemd. Старое название признано неточным и объявлено устаревшим.
  • Исполняемый файл sort использует ELF-заметку .note.dlopen от UAPI Group, чтобы указать зависимость от libcrypto.

Для подготовки выпуска использовались Autoconf 2.73.16-0a513, Automake 1.18.1, Gnulib 2026-09-07 (106e9b2384d08a1696fcbd40cbab52237943f208) и Bison 3.8.2.

Загрузка и проверка

Исходный код доступен в архивах tar.gz (16 МБ) и tar.xz (6,4 МБ). Для загрузки также можно выбрать зеркало GNU.

Отдельные GPG-подписи доступны для tar.gz и tar.xz. Скачайте архив и соответствующий файл подписи, затем выполните:

bash
gpg --verify coreutils-9.12.tar.gz.sig coreutils-9.12.tar.gz

Подпись должна соответствовать ключу Pádraig Brady с отпечатком:

text
6C37 DC12 121A 5006 BC1D  B804 DF6F D971 3060 37D9

Если ключ отсутствует или устарел, его можно получить или обновить одним из способов ниже, после чего повторить проверку:

bash
gpg --locate-external-key P@draigBrady.com
gpg --recv-keys DF6FD971306037D9
wget -q -O- 'https://savannah.gnu.org/project/release-gpgkeys.php?group=coreutils&download=1' | gpg --import -

Если эти способы недоступны, можно использовать официальный набор ключей GNU:

bash
wget -q https://ftp.gnu.org/gnu/gnu-keyring.gpg
gpg --keyring gnu-keyring.gpg --verify coreutils-9.12.tar.gz.sig coreutils-9.12.tar.gz

Контрольные суммы SHA256 и SHA3-256 в формате Base64:

text
SHA256 (coreutils-9.12.tar.gz) = FMv1pN4Me3+jufp/raTFiy3v4zM2qo/YPXYixcTr3BM=
SHA3-256 (coreutils-9.12.tar.gz) = 14aJyepDW60jsaL4cq5T/UFMwUJEkXDyUqZEQlsnLFM=
SHA256 (coreutils-9.12.tar.xz) = pIAZhVlzPps9qZnpBUOsb4iKLKpUTY1mTFofF+Uo4hA=
SHA3-256 (coreutils-9.12.tar.xz) = cKcyD1sxJr1tdWgWbh0+OKwOEIpaf2ACThlaHZooZDA=

Для проверки SHA256 используется cksum -a sha256 --check из Coreutils 9.2 и новее или cksum из OpenBSD начиная с 2007 года. Проверка SHA3-256 командой cksum -a sha3 --check доступна с Coreutils 9.8.

Исходный код и участники

Выпуск соответствует тегу v9.12 и коммиту c0f8514d989184921d9b12a4d103a7b23abc5af8. Репозиторий можно получить командой:

bash
git clone https://https.git.savannah.gnu.org/git/coreutils.git

Сводка изменений и участников доступна в журнале репозитория. В локальной копии репозитория её можно вывести командой:

bash
git shortlog v9.11..v9.12

В выпуск внесли вклад Arun Bhattacharya (1 коммит), Ayesha Shafique (1), Bruno Haible (5), Collin Funk (98), Guanqiang Han (1), H. Peter Anvin (1), Ismail Ramzi (1), Iván Ezequiel Rodriguez (2), Leonid Evdokimov (1), Mateusz Nosek (1), Max Downey Twiss (1), Paul Eggert (12), Pádraig Brady (118), Sylvestre Ledru (33), aizu-m (2) и oech3 (11). О выпуске от имени сопровождающих Coreutils объявил Pádraig Brady.

Официальный сайт GNU Coreutils