Состоялся релиз uutils Coreutils 0.11, представляющий собой крупное обновление кроссплатформенной переписанной на языке Rust альтернативы утилитам GNU Coreutils. Разработчики проделали большую работу по оптимизации производительности, улучшению совместимости и повышению безопасности.

Новый диагностический движок и понятные ошибки
Одним из самых заметных нововведений стал принципиально новый движок диагностики, созданный на базе библиотеки Ariadne. Вместо привычного традиционного сообщения об ошибке в командной строке утилиты теперь способны выводить переданный аргумент и указывать значком каретки прямо под проблемным символом. Такой подход напоминает систему сообщений об ошибках в современных компиляторах.
Подобная улучшенная диагностика уже внедрена во многие утилиты, среди которых chmod, mkdir, install, tr, sort, cut, head, tail, split, dd, stat, join, ls, df и du. Кроме того, сообщения могут содержать краткие подсказки с пояснением ожидаемого синтаксиса, сохраняя при этом полную совместимость с локализованным выводом. Помимо этого, в ряде команд теперь используются реальные системные сообщения об операционной системе вместо усеченных или самодельных альтернатив.
Оптимизация производительности и профилирование
Для официальных сборок под операционные системы Linux, macOS и Windows теперь применяется оптимизация на основе профиля Profile-Guided Optimization. По данным разработчиков, это позволяет повысить общую производительность утилит на величину до 31%. Дополнительные точечные оптимизации затронули и конкретные команды.
Наиболее впечатляющий результат показала утилита cp, которая теперь открывает файлы только один раз при определенных операциях, что обеспечило прирост скорости на 32.93%. Она также умеет повторно использовать уже открытый дескриптор файла назначения, если операция reflink переключается на стандартное копирование. Заметное ускорение получила и утилита join. Согласно внутренним тестам проекта, при обработке парных входных данных она работает в 1.37 раза быстрее, а в отдельных сценариях превосходит оригинальный GNU join примерно в 2.5 раза.
Дополнительная работа по повышению скорости затронула такие инструменты, как dd, tac, od, ptx, nl, tail, expand, unexpand, numfmt и sort. В них инженеры сократили лишние выделения памяти, системные вызовы и операции копирования данных. Вдобавок команда проекта приняла новое правило: если любая из утилит uutils оказывается значительно медленнее своего аналога из GNU, это квалифицируется как баг, требующий исправления.
Совместимость с GNU и новые функции
Уровень совместимости с оригинальным пакетом GNU Coreutils продолжает расти. В версии 0.11 набор uutils успешно проходит 653 теста из официального тестового набора GNU против 645 тестов в предыдущей версии 0.10. Количество падающих тестов сократилось с 28 до 22, а ошибки в тестовом пакете впервые упали до нуля. В результате общая измеренная совместимость увеличилась с 94.44% до 95.33%.
Командная строка пополнилась новыми опциями, совместимыми с GNU. Среди них появились uname -A/—all-labeled, cut -F и —whitespace-delimited, а также дополнительные параметры и псевдонимы для pr. Исправлено множество поведенческих отличий в таких утилитах, как pr, numfmt, uniq, truncate, paste, join, id, mkdir, more, fold, sort, stat, od и date.
Безопасность и поддержка интернационализации
Отдельное внимание в релизе уделено вопросам безопасности и корректности работы с файловыми системами. Утилиты cp и mv перешли на операции на основе файловых дескрипторов, что помогает решать проблемы типа TOCTOU, связанные с расширенными атрибутами. Команда rm перестала следовать за символическими ссылками, подмененными в операнде в ходе рекурсивного удаления. Утилита chmod была дополнительно защищена при работе с рекурсивными вызовами и символическими ссылками, а cp научилась избегать изменения прав доступа через целевую символическую ссылку.
Улучшения коснулись и интернационализации. Команда ls теперь сортирует имена файлов с учетом правил конкретной локали, comm использует правила локали при сравнении строк, а cut корректно обрабатывает многобайтовые поля, символы и разделители. Полный список изменений доступен в официальном журнале изменений проекта.






