Реклама
Перетяжка // Коробка 3.0

Rust Coreutils 0.11 показывает ошибку кареткой и ускоряет cp на треть

Переменная UUTILS_DIAG управляет новым форматом; в пайпах остаётся однострочное сообщение.

Обложка: Rust Coreutils 0.11 показывает ошибку кареткой и ускоряет cp на треть

Проект 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.

Ключевые выводы
  • Новый диагностический движок на библиотеке ariadne: подсказки с указателем в 28 утилитах.
  • Переменная UUTILS_DIAG принимает always, never и auto; в скриптах и пайпах по умолчанию сохраняется однострочное сообщение.
  • PGO-сборки для Linux, macOS и Windows дают до 31% прироста; cp ускорен на 32,93%, join в одном сценарии в 2,5 раза быстрее GNU.
  • Совместимость с тестами GNU: 653 успешных, 22 неудачных, 10 пропущенных из 685; было 645 и 28.
  • Исправлены TOCTOU-проблемы в mv, cp, rm и chmod; 358 pull request от 26 новых участников.

Как выглядит новая ошибка

Идея, описанная Сильвестром Ледрю в блоге проекта, проста: 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: новая диагностика ошибок

Изображение на обложке: uutils