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:
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. Скачайте архив и соответствующий файл подписи, затем выполните:
gpg --verify coreutils-9.12.tar.gz.sig coreutils-9.12.tar.gz
Подпись должна соответствовать ключу Pádraig Brady с отпечатком:
6C37 DC12 121A 5006 BC1D B804 DF6F D971 3060 37D9
Если ключ отсутствует или устарел, его можно получить или обновить одним из способов ниже, после чего повторить проверку:
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:
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:
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. Репозиторий можно получить командой:
git clone https://https.git.savannah.gnu.org/git/coreutils.git
Сводка изменений и участников доступна в журнале репозитория. В локальной копии репозитория её можно вывести командой:
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.