
Коротко о главномРазвернутьСвернуть
- Проект uutils 31 августа выпустил Rust Coreutils 0.
- 0, переписанный на Rust набор базовых утилит Linux.
- Главное изменение видно сразу: cut , chmod , sort и ещё 25 утилит при ошибке в аргументах показывают строку с указателем на проблемный символ, как это делают компиляторы Rust и Clang.
Проект uutils 31 августа выпустил Rust Coreutils 0.11.0, переписанный на Rust набор базовых утилит Linux. Главное изменение видно сразу: cut , chmod , sort и ещё 25 утилит при ошибке в аргументах показывают строку с указателем на проблемный символ, как это делают компиляторы Rust и Clang. Плюс сборки с PGO, которые, по данным команды, дают до 31% прироста, и cp , ускоренный на 32,93%.
Для тех, кто пользуется обычными GNU Coreutils, ничего не меняется, пока дистрибутив не переключится сам. Но тенденция понятна: Ubuntu уже ставит Rust-реализацию по умолчанию, и вопрос «а чем это отличается» становится практическим. Ответ версии 0.11: сообщениями об ошибках, скоростью и очередным шагом к полной совместимости с GNU.
Как выглядит новая ошибка
Идея, описанная Сильвестром Ледрю в блоге проекта , проста: GNU-утилиты десятилетиями отвечали на опечатку сухой строкой вроде «invalid field specification», и пользователь сам искал, где именно ошибся. Теперь под командой печатается сама команда, а под ней каретка, указывающая на неверный символ, и короткое объяснение. Реализовано это на библиотеке ariadne , той же, что используют некоторые парсеры на Rust.
Важная деталь для тех, кто пишет скрипты: многострочная диагностика включается только в интерактивном терминале. В пайпах и при перенаправлении вывода по умолчанию остаётся привычное однострочное сообщение, поэтому парсеры stderr не сломаются. Управляет этим переменная окружения UUTILS_DIAG со значениями always , never и auto . Попробовать без установки можно в браузерной песочнице проекта.
Скорость: «медленнее GNU теперь считается багом»
Команда прямо формулирует новую политику: «утилита, которая значительно медленнее GNU, теперь считается багом» (перевод редакции). В релизе это подкреплено PGO-сборками для Linux, macOS и Windows, которые, по замерам проекта, дают до 31% прироста. Отдельно названы cp , ускоренный на 32,93%, и join , который в одном из сценариев работает в 2,5 раза быстрее GNU-версии. Это замеры самого проекта на его наборах; на других данных разница будет иной.
Совместимость с GNU
Таблица в релизе сравнивает результаты на тестовом наборе GNU Coreutils: в 0.10.0 было 645 успешных и 28 неудачных тестов из 683, в 0.11.0 стало 653 успешных, 22 неудачных и 10 пропущенных из 685. Оставшиеся расхождения касаются редких флагов и краевых случаев, но именно они всплывают в старых скриптах, поэтому перед заменой системных утилит стоит прогнать свои сценарии.
Из исправлений безопасности названы TOCTOU-проблемы, то есть гонки между проверкой и использованием файла, в mv , cp , rm и chmod ; также закрыты зависания и переполнения. Реализации kill и uptime доработаны для Windows.
Как попробовать
Проект распространяется под лицензией MIT и рассчитан на Linux, Windows, Redox и Fuchsia. Самый безопасный способ познакомиться: поставить uutils рядом с системными утилитами, а не вместо них. По README проекта, сборка из исходников выполняется через cargo , а в ряде дистрибутивов пакет называется uutils-coreutils или rust-coreutils и ставит бинарники в отдельный каталог. Точные имена пакетов зависят от дистрибутива, поэтому проверять их стоит в его репозитории.
Если ваши скрипты парсят stderr утилит, оставьте UUTILS_DIAG в значении auto: тогда в неинтерактивном режиме формат ошибок не изменится.
В релиз вошли 358 pull request от 26 новых участников; всего в проекте отметились более 1000 контрибьюторов. Редакция проверит, как изменится таблица совместимости в 0.12.
Источники: Релиз 0.11.0 на GitHub , Блог uutils: новая диагностика ошибок


