Rust Coreutils 0.10 est sorti le 5 août, et le chiffre qui raconte l'histoire est 645 cas réussis de la suite de tests GNU contre 29 échecs, contre 625 dans la version 0.9. Cela fait passer le taux de réussite de 90,58 pour cent à 93,48, un record pour le projet. Le reste de la version est le genre de travail qu'un remplaçant transparent doit accomplir avant qu'on lui fasse confiance : une campagne anti-panique sur plus de vingt utilitaires, la fermeture des courses entre vérifier et agir sur un chemin, les étiquettes SELinux posées dès la création, et quelques options réellement nouvelles dont mv --exchange pour échanger deux chemins de façon atomique.
The short answer
Rust Coreutils 0.10 est arrivé le 5 août avec la meilleure compatibilité GNU du projet à ce jour et une version consacrée presque entièrement à devenir fiable plutôt que nouvelle. Les courses entre vérifier et agir sur un chemin ont été fermées, les étiquettes SELinux sont désormais posées quand mkdir, mkfifo et mknod créent quelque chose plutôt qu'après, et les paniques ont été retirées de plus de vingt utilitaires dont sort, chmod et install. Parmi les nouvelles options : mv --exchange pour les échanges atomiques, rm --one-file-system et install --reflink. Une cible wasm32-wasip2 a été ajoutée et le support Windows élargi.
Il existe un type de version bien particulier qui signale qu'un projet a cessé de chercher à impressionner et commencé à chercher à être fiable. Rust Coreutils 0.10, publié le 5 août, en fait partie. Presque rien n'y est une fonctionnalité. L'essentiel consiste à retirer des raisons de ne pas l'utiliser.
La mesure sur laquelle le projet se juge est la suite de tests des coreutils GNU, et la 0.10 réussit 645 cas contre 29 échecs. La version 0.9 en réussissait 625. Vingt-sept échecs de moins font passer le taux de 90,58 pour cent à 93,48, présenté comme un record. Ce qui se cache derrière ce chiffre est banal et précis : nproc qui se comporte correctement selon les conditions du processeur, date qui gère les années hors plage ordinaire, des différences de formatage que personne ne remarque jusqu'au jour où un script en dépend.
Les paniques devaient partir
L'entrée la plus importante du journal des modifications n'apparaît pas dans le titre.
Le mode de défaillance ultime de Rust est la panique : le programme abandonne, affiche un message évoquant un fil en panique, et sort d'une manière qu'aucun script shell n'anticipe. C'est acceptable dans un prototype et inacceptable dans sort. Le contrat Unix classique est étroit et tout le monde bâtit dessus : faire le travail, ou échouer avec un code de sortie documenté et un message sur la sortie d'erreur. Une panique ne respecte ni l'un ni l'autre, et une chaîne de commandes qui en reçoit une ne sait absolument pas quoi en faire.
La version 0.10 a parcouru plus de vingt utilitaires pour en retirer les paniques et les abandons, dont sort, chmod et install, en les remplaçant par une vraie gestion d'erreurs. Ce travail ne se montre pas sur une capture d'écran. C'est la différence entre un outil que les gens essaient et un outil que les gens mettent dans une tâche planifiée.
La même version a fermé les courses entre la vérification d'un chemin et l'action sur ce chemin, et modifié mkdir, mkfifo et mknod pour que les étiquettes SELinux soient posées à la création plutôt qu'ensuite. Poser une étiquette après coup laisse un instant où l'objet existe sans étiquette, et sur un système où l'étiquette est la politique, cet instant est un problème de correction.
De vraies nouvelles options, brièvement
Trois méritent d'être connues.
mv --exchange échange deux chemins de façon atomique. Il n'existe aucun instant où l'un des noms pointe vers rien. C'est le problème du déploiement en une commande : un répertoire en production et une nouvelle version, échangés sans fenêtre pendant laquelle une requête arrive et trouve un chemin vide. Linux expose cela au niveau des appels système depuis des années via RENAME_EXCHANGE, mais y accéder supposait d'écrire du code plutôt que de taper une commande.
rm --one-file-system refuse de franchir un point de montage, l'option que vous voulez chaque fois qu'une suppression récursive tourne là où un partage réseau ou un montage lié pourrait être attaché.
install --reflink utilise le clonage en copie sur écriture là où le système de fichiers le permet, si bien qu'installer un gros fichier coûte des métadonnées plutôt que des octets sur btrfs ou XFS.
S'y ajoutent un moteur OpenSSL pour les utilitaires de somme de contrôle, des indices de lecture anticipée sur ces mêmes outils, un chemin rapide sans copie dans tee, et la fonction index d'expr qui passe du quadratique au linéaire sur la longueur de ses entrées.
L'écart entre tout cela et votre machine
Il faut être clair là-dessus, parce qu'un journal des modifications invite à la mauvaise hypothèse.
Ubuntu 26.04 LTS livre uutils coreutils 0.8.0 comme espace utilisateur par défaut. Cette version est la 0.10. Rien de ce qui est décrit ici ne se trouve aujourd'hui sur une machine LTS. Ubuntu 25.10 a opéré le basculement initial, et la presse qui a suivi la transition note que cp, mv et rm ont été délibérément laissés sur les implémentations GNU pendant que le reste migrait, ce qui est une façon raisonnable d'échelonner un changement aussi large.
Cela veut aussi dire que mv --exchange, la chose la plus immédiatement utile de cette version, n'est pas ce que les utilisateurs Ubuntu obtiendront en mettant uutils à jour, puisque mv fait partie des trois qui n'ont pas migré.
Ce que nous ferions
Découvrir ce que vous faites tourner, puis ne rien toucher.
La commande à lancer est sort --version ou chmod --version sur la machine qui vous intéresse. La sortie donne l'implémentation et la version en une ligne, et sur un système mixte la réponse peut varier d'une commande à l'autre. Cela vaut la peine de le savoir avant de déboguer quelque chose d'étrange, pas après.
Au-delà, ce n'est pas une version à courir après. La valeur de la 0.10 tient à ce qu'une réécriture est devenue plus ennuyeuse, et l'ennui arrive tout seul par votre distribution. Le seul groupe que nous pousserions un peu, ce sont ceux qui maintiennent des scripts destinés à tourner sur Ubuntu 25.10 ou ultérieur : testez-les dès maintenant contre les implémentations uutils, dans un conteneur, plutôt que de découvrir les sept pour cent de différence de comportement restants pendant un déploiement.
Sources et pour aller plus loin
- Notes de version uutils coreutils 0.10.0 sur GitHub
- Rust Coreutils 0.10 released with more security hardening, increased GNU compatibility, Phoronix, 5 août 2026
- Le projet uutils
- Guide des coreutils Rust sur Ubuntu 26.04, ComputingForGeeks
- Documentation des coreutils GNU
Questions fréquentes
Comment cela se compare-t-il à ce qu'Ubuntu livre réellement ?
Ubuntu 26.04 LTS livre uutils coreutils 0.8.0 comme espace utilisateur par défaut, ce qui signifie que la version décrite ici a deux crans d'avance sur ce que porte l'actuelle LTS. Cet écart compte quand on lit un journal des modifications : une option comme mv --exchange ou un cas limite corrigé dans date n'est pas quelque chose dont vous disposez aujourd'hui sur une machine LTS, c'est quelque chose qui arrivera à un cycle futur. Ubuntu 25.10 fut la première version à opérer le basculement, et la presse qui a suivi la transition note que cp, mv et rm ont été délibérément laissés sur les implémentations GNU pendant que le reste migrait, ce qui est une façon raisonnable d'échelonner un changement de cette ampleur. Pour savoir quelle implémentation porte une commande donnée sur votre machine, interrogez le binaire plutôt que de supposer : la chaîne de version le dit immédiatement.
Qu'est-ce que la campagne anti-panique et pourquoi compte-t-elle plus qu'il n'y paraît ?
Une panique en Rust est un arrêt irrécupérable. Le programme s'arrête, affiche un message évoquant un fil en panique, et sort avec un code qu'aucun script shell n'a été écrit pour attendre. Pour une bibliothèque, c'est ennuyeux. Pour sort, chmod ou install, c'est pire, parce que ces commandes vivent dans des scripts et des chaînes qui supposent le contrat classique : faire le travail, ou échouer avec un code de sortie documenté et un message sur la sortie d'erreur. Une panique ne respecte aucune des deux moitiés. La version 0.10 a parcouru plus de vingt utilitaires pour retirer les paniques et les abandons et les remplacer par une vraie gestion d'erreurs, un travail ingrat qui ne produit aucune fonctionnalité à montrer. C'est aussi exactement ce qui doit arriver avant qu'une réécriture puisse tourner sous l'automatisation des autres.
Que fait exactement mv --exchange ?
Il échange deux chemins de façon atomique, si bien qu'à aucun instant observable l'un des noms ne pointe vers rien ou vers la mauvaise chose. Le problème classique qu'il résout est l'échange de déploiement : vous avez un répertoire en production et un autre fraîchement construit, et vous voulez mettre le nouveau en place sans fenêtre pendant laquelle une requête arrive et trouve le chemin absent. Le contournement habituel est un lien symbolique et un renommage, ce qui fonctionne mais suppose que l'indirection par lien existe déjà. Un échange atomique le fait directement sur les deux chemins réels. Linux gère cela au niveau des appels système depuis des années via le drapeau RENAME_EXCHANGE, et c'était accessible depuis C et depuis des langages de plus haut niveau, mais pas comme simple option en ligne de commande. Maintenant, si.
Rust Coreutils est-il déjà un remplaçant vraiment transparent ?
À 93,48 pour cent de la suite de tests GNU, presque mais pas tout à fait, et les 29 échecs restants sont la partie intéressante. Un taux de réussite est un instrument grossier : les tests qui échouent en dernier sont d'ordinaire les plus étranges, et un comportement étrange est précisément ce dont un script écrit il y a quinze ans peut dépendre. Notre lecture honnête est que pour l'usage interactif et pour les scripts écrits cette décennie, la différence ne se remarquera pas. Pour un système de compilation, une chaîne d'empaquetage ou un script d'init hérité de quelqu'un qui est parti, l'hypothèse prudente est que vous trouverez au moins une chose qui se comporte autrement, et la bonne pratique est de la trouver en environnement de test plutôt qu'en production. Le projet publie son taux de réussite ouvertement, ce que peu de réécritures font.
Qu'y a-t-il dans cette version pour Windows ou WebAssembly ?
Plus que ce que le nom du projet laisse supposer. La version 0.10 ajoute une cible de compilation wasm32-wasip2, qui place ces outils à l'intérieur des moteurs WebAssembly, et poursuit le remplissage du support Windows avec une implémentation fonctionnelle de timeout, tail -f, la gestion des fichiers creux dans cp et des corrections de fins de ligne CRLF dans cksum. Cette portée multiplateforme est la partie de l'histoire d'uutils qui reçoit le moins d'attention et sans doute le meilleur argument pour son existence. Les coreutils GNU sont une réponse Unix à un problème Unix. Une réécriture en Rust se compile vers des cibles que les coreutils GNU n'allaient jamais atteindre, ce qui rend le même comportement de commande disponible sur un agent de compilation Windows ou dans un moteur isolé sans avoir à y embarquer tout un environnement.