Ce qui se passe
Un outil Unix signale ses erreurs sur une ligne d'erreur standard. Cette ligne
dit ce qui ne va pas, jamais où. Pour la plupart des commandes il n'y a
rien à pointer — mais quelques-unes prennent des arguments qui sont de petits
langages : une expression test, un mode chmod, une clé de tri, une liste de
champs pour cut.
Depuis la version 0.11.0, uutils coreutils — la réécriture en Rust des
coreutils GNU — répond à cette question comme le fait rustc : avec un curseur
sous le fautif. Le rendu s'appuie sur la bibliothèque ariadne, et l'idée
vient de uutils awk, qui procédait déjà ainsi pour les programmes awk.
À quoi ça ressemble
Le message historique reste imprimé, et le rapport vient dessous :
$ tr 'qw[y-b]' x
tr: range-endpoints of 'y-b' are in reverse collating sequence order
╭─[ tr:1:7 ]
1 │ tr qw[y-b] x
│ ─┬─
│ ╰─── did you mean 'b-y'?
│ Help: a range goes from the lower character to the higher one, as in a-z
───╯L'ancien message parlait d'ordre de séquence de collation — utile si vous savez déjà ce que c'est. Le rapport, lui, souligne l'intervalle et propose l'inversion.
Le curseur n'est pas obligé de couvrir un argument entier : sur
chmod 'g+rw?x', il désigne le seul ?. Sur cut -f 1,4-2,9-12, il isole
4-2 dans une liste longue au lieu d'annoncer une erreur globale. Sur
head -c 1fb, il distingue laquelle des deux moitiés — le nombre ou l'unité —
a été rejetée.
Ce que ça change concrètement
28 utilitaires en bénéficient en 0.11.0. Parmi eux : test, expr,
chmod, mkdir, mkfifo, mknod, install, tr, sort, numfmt,
printf, seq, stat, env, dd, join, cut, csplit.
Deux détails d'implémentation valent d'être notés, parce qu'ils décident de l'adoption :
- Le rapport n'est rendu que si la sortie d'erreur est un terminal. Redirigée dans un fichier ou un tube, la sortie ne change pas : vos scripts et vos greps ne bougent pas.
- Le message d'origine est conservé au-dessus du rapport. La compatibilité passe avant la nouveauté, ce qui permet d'ajouter le diagnostic sans casser ce qui lisait la première ligne.
Un seul analyseur traite toutes les tailles de la suite : le même rapport
apparaît donc pour tail -c, truncate -s, split -b, shred -s, od -N,
sort -S, les tailles de bloc de du -B, df -B, ls --block-size et le seuil
de du -t.
À retenir
Ces commandes ne sont plus une curiosité : elles remplacent les coreutils GNU par défaut dans plusieurs distributions récentes, donc le changement finira par arriver sans que vous l'ayez demandé. Le billet est signé Sylvestre Ledru et daté du 31 août 2026 ; chaque exemple est rejouable dans le bac à sable WebAssembly du site.
Source : uutils